Skip to content
Snippets Groups Projects
Commit 3ec3193f authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Remove docs

parent bafbf81f
No related branches found
No related tags found
1 merge request!86Merge school-apps
Showing
with 0 additions and 4382 deletions
File deleted
File deleted
File deleted
File deleted
File deleted
File deleted
File deleted
File deleted
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: 32ad6cb8e26e956c14746f5b9b7d3500
tags: 645f666f9bcd5a90fca523b33c5a78b7
AUB (Antrag auf Unterrichtbefreiung)
====================================
Stichworte
----------
Workflow
^^^^^^^^
1. Lehrer füllt Antragsformular aus
- Beginn Datum (DateField)
- Beginn Stunde oder Uhrzeit (Int 1..9 / Time)
- Ende Datum (DateField)
- Ende Stunde oder Uhrzeit (Int 1..9 / Time)
- Beschreibung/Begründung (TextField)
- Antragsteller (Lehrerkürzel) wird automatisch aus angemeldetem Benutzer generiert
2. Schulleiter erhält Anträge und a. bewilligt oder b. lehnt ab
a. Stellvertreter prüft Antrag und i. bewilligt oder ii. lehnt ab
i. Lehrkraft erhält Benachrichtigung über Bewilligung
ii. Lehrkraft erhält Benachrichtigung über Ablehnung
b. Lehrkraft erhält Benachrichtigung über Ablehnung
.. automodule:: aub.models
:members:
\ No newline at end of file
App: Dashboard
==============
Das Dashboard dient dazu, den Benutzer zu begrüßen (Startseite)
und seine letzten Aktivitäten anzuzeigen.
Außerdem zeigt das Dashboard aktuelle Nachrichten für den Benutzer an.
Aktivitäten
-----------
Definition einer Aktivität
Als Aktivität gilt alles, was der Nutzer selbst macht, d.h., aktiv.
.. autoclass:: dashboard.models.Activity
:members:
Benachrichtigungen
------------------
Definition einer Benachrichtigung
Eine Benachrichtigung für einen Nutzer wird erstellt, wenn eine Aktion, die diesen betrifft,
die er aber nicht selbst durchgeführt hat, passiert ist, um den Nutzer zu informieren.
.. autoclass:: dashboard.models.Notification
:members:
Hinweis zum Erstellen von absoluten URLs auf der Basis relativer URLs
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Dies wird durch übergabe eines dynamischen Linkes (z. B. /aub/1) an die Methode :func:`request.build_absolute_uri()` [1]_ erreicht.
Um einen dynamischen Link durch den Namen einer Django-URL zu "errechnen", dient die Funktion :func:`reverse()` [2]_.
.. seealso::
.. [1] https://docs.djangoproject.com/en/2.1/ref/request-response/#django.http.HttpRequest.build_absolute_uri
.. [2] https://docs.djangoproject.com/en/2.1/ref/urlresolvers/#reverse
Caches
------
SchoolApps benutzt eine angepasste Version des Django-Cache-Systems, welches dabei um eine Verwaltungsfunktion für verschiedene Caches ergänzt wurde.
Sitecache
Ein Seitencache basiert auf dem Django-Decorator :func:`@cache_page` und cacht die HTML-Ausgabe des entsprechenden Views.
Variablencache
Ein Variablencache nutzt die Low-Level-Cache-API von Django und speichert den Inhalt einer Variable.
Verwaltung
^^^^^^^^^^
Jedes gecachte Objekt (ob Sitecache oder Variablencache) benötigt ein Cache-Objekt in der DB. Bei Cacheinhalten für die nur eine Variable gespeichert werden muss oder ein View, wird die Datei `caches.py` verwendet, wo der Cache als Konstante gespeichert ist:
.. code-block::
<EXAMPLE_CACHE>, _ = Cache.objects.get_or_create(id="<example_cache>",
defaults={
"site_cache": <True/False>,
"name": "<Readable name>",
"expiration_time": <10>}) # in seconds
Verwendung
^^^^^^^^^^
Variablencache
..............
Für Variablencaches kann mit der Funktion :func:`get()` eines Cache-Objektes der aktuelle Inhalt des Caches abgefragt werden.
Bei abgelaufenen Caches wird ``False`` zurückgeben, dann ist der Wert neu zu berechnen
und mit :func:`update()` zu aktualisieren, wobei die Aktualisierungszeit automatisch zurückgesetzt wird.
Sitecache
.........
Für einen Sitecache kann folgender Decorator zum entsprechenden View hinzugefügt werden:
.. code-block::
@cache_page(<EXAMPLE_CACHE>.expiration_time)
Hintergrundaktualisierung
^^^^^^^^^^^^^^^^^^^^^^^^^
API
^^^
.. autoclass:: dashboard.models.Cache
:members:
Verschiedene Caches
^^^^^^^^^^^^^^^^^^^
.. automodule:: dashboard.caches
:members:
.. seealso::
- https://docs.djangoproject.com/en/2.2/topics/cache/
\ No newline at end of file
Development Guide
=================
Diese Anleitung soll für einen einheitliches Development und einheitlichen Code in SchoolApps sorgen.
Versionsverwaltung – Einsatz von Git
------------------------------------
Es wird mit **Git** gearbeitet. Die Verwendung ist Pflicht, die Regelungen im Git-Management Guide sind zu beachten. Alle Veränderungen sollten nach Beendigung der Arbeit an SchoolApps direkt im entsprechenden Featurebranch committed und gepusht werden, auch wenn sie noch nicht fertig oder lauffähig sind, um Datenverlust vorzubeugen (hierbei unbedingt den Bereich Branches im Git-Management Guide beachten).
Codestyle
---------
Grundsätzlich wird **auf englisch gecodet**: Englische Variablen, englische Kommentare und englische Commits. Die Oberfläche wird natürlich auf deutsch lokalisiert. Lediglich Issues auf GitHub und die Dokumentation werden auf deutsch verfasst.
Weiterhin gilt es, die **PEP-8-Richtlinien** der Python Foundation einzuhalten, sie sorgen für einen sauberen, einheitlichen und übersichtlichen Stil.
**Tipp:** Viele Editoren können die Pythonskripte auch automatisch nach PEP8 formatieren – meistens klappt das sehr gut (siehe auch „Editoren/IDEs“).
Editoren/IDEs
-------------
Natürlich kann man auch im Texteditor des jeweiligen Betriebssystemes oder in der IDLE von Python programmieren.
Allerdings empfiehlt es sich gerade bei so großen (Django-)Projekten wie SchoolApps einen vernünftigen **Editor** oder eine **IDE** (Integrated Development Environment) zu benutzen.
Folgende Software ist sehr empfehlenswert:
Atom
Ein Opensource-Editor von GitHub. Einfache Bedienung, gute Syntaxhervorhebung, mit Plugins auch Autovervollständigung und Codeformatierung
Visual Code
Ein Opensource-Projekt von Microsoft. Sehr ähnlich zu Atom.
PyCharm Community/Professional Edition
Kommerzielles Programm, gibt es in einer OpenSource-Version (Community) sowie einer Bezahlversion (Professional). Alle Funktionen von VisualCode und Atom enthalten, zudem wird in der Professional Edition Django von Haus aus unterstützt. TIPP: Die Professional Edition gibt es für den Bildungsbereich kostenlos.
Dokumentation
-------------
„It was hard to write, it should be hard to read.“
Alle Programmierer hassen es – dennoch ist **Kommentieren** die beste Dokumentationsmöglichkeit, damit andere Leute den eigenen Quellcode lesen können.
Alle Funktionen (Klassen, etc.) sollten mit Docstrings versehen sein.
Docstrings werden nach dem folgenden Schema aufgebaut: https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html
Jede App, die sich in ihrer Funktion bzw. Funktionsweise nicht selbst erklärt, sollte einen Eintrag in der Dokumentation besitzen,
die den Programmierer über Sinn und Zweck aufklärt. Dies gilt insbesondere, wenn diese App auch Funktionen für andere Apps bereitstellt.
Diese sollten in der Dokumentation gesondert erwähnt und sauber dokumentiert werden. Weitere Informationen zur Dokumentation gibt es unter :doc:`doc`.
In der **Install.md** (im Wurzelverzeichnis) sollten alle Schritte zur Installation dokumentiert werden.
Insbesondere gilt das, wenn man eine neue Bibliothek für eine bestimmte Funktionalität benötigt. Diese muss sofort aufgeführt werden, damit andere Entwickler den Code ohne großes Basteln zum Laufen bekommen.
Problem, Bug, Idee? – Issues verwenden!
---------------------------------------
Hier sei nochmal auf den Bereich „Issues“ im :doc:`git` hingewiesen – unbedingt beachten!
\ No newline at end of file
Dokumentation
=============
Zur Dokumentation wird das Tool sphinx eingesetzt. Die gesamte Dokumentation liegt im Unterordner ``docs``.
- Formatierung in reStructuredText
- Erstellen der HTML-Ausgabe
``make html``, Ergebnis in ``docs/_build/html``
Docstrings
----------
Struktur bei Funktionen
.. code-block::
""" [Summary]
:param [ParamName]: [ParamDescription], defaults to [DefaultParamVal]
:type [ParamName]: [ParamType](, optional)
...
:raises [ErrorType]: [ErrorDescription]
...
:return: [ReturnDescription]
:rtype: [ReturnType]
"""
Struktur bei Klassen
.. code-block::
""" [Summary]
"""
Struktur bei Variablen
.. code-block::
#: [Summary]
\ No newline at end of file
Git Management Guide
====================
Diese Anleitung soll bei der Benutzung von Git im Projekt SchoolApps helfen.
Hinweis
-------
Hilfe und Informationen zu Git allgemein gibt es u. a. bei dieser Anleitung:
https://rogerdudler.github.io/git-guide/index.de.html
Git-Hosting von SchoolApps
--------------------------
Die aktuelle Version von SchoolApps ist auf GitHub in der Organisation Katharineum gehosted:
https://github.com/Katharineum/school-apps
Das Cloning sowie Pullen und Pushen kann wahlweise mittels SSH oder HTTPS erfolgen (genaueres in der obigen Anleitung).
.. note::
Der Zugriff auf das Repository wird von Herrn Poetzsch-Heffter (@poetzsch, p-h@katharineum.de) geregelt.
Clonen und Ersteinrichtung
--------------------------
Clonen:
``git clone https://github.com/Katharineum/school-apps``
oder ``git clone git@github.com:Katharineum/school-apps.git``
Um sich eine Entwicklungsumgebung für SchoolApps einzurichten, wird die Anleitung auf
https://github.com/Katharineum/school-apps/blob/dev/README.md
unter dem Reiter Installation empfohlen.
Was gibt es zu tun? – Issues
----------------------------
Issues anlegen
^^^^^^^^^^^^^^
Wenn einem in der SchoolApps etwas auffällt was getan werden sollte (Bug, Rechtschreibfehler, Zusätzliche Funktionen, etc.), dann muss ein Issue auf GitHub erstellt werden. Dies gilt auch, wenn man sich sicher ist, das Problem lösen zu können.
Wichtig beim Erstellen eines Issues:
""""""""""""""""""""""""""""""""""""
* Aussagekräftigen Titel verwenden (deutsch)
* Problem detailliert beschreiben, falls vorhanden, Lösungsmöglichkeit(en) nennen (deutsch)
* **Assignees (Zuständigkeit)** → Wenn man das Problem selbst lösen will bzw. sich darum kümmern will, empfiehlt es sich, sich selbst einzutragen. Damit ist man auch für die Lösung verantwortlich. Wenn man weiß, dass dieses Problem genau von einer bestimmten Person gelöst werden kann bzw. diese dafür zuständig ist, wird diese eingetragen. Es können auch mehrere Personen eingetragen werden.
* **Labels (Kategorisierung)** → Es gibt zwei Arten von Labels:
* **Bereichslabel** → Hier wird der Teil der Software genannt, der von dem Issue betroffen ist (im Regelfall eine Django-App, manchmal auch *whole project*)
* **Kategorisierungslabel** → Hier wird die Art des Issue festgelegt.
* *bug* → Ein eindeutiger Fehler. (Sicherheits-/ Funktionsbeinträchtigend)
* *beauty mistake* → Schönheitsfehler. (Meist Designtechnisch)
* *refactoring* → Code(-style) verbessern, umprogrammieren.
* *it works but it is wrong* → Unsauber gelöste Probleme, fehlende Komponenten.
* *new feature* → Neue Funktionen.
* *discussion* → Zu diskussieren. Diese Issues *sollen nicht* umgesetzt werden, bis dieses Label entfernt wurde.
Es können auch mehrere Bereichs- bzw. Kategorisierungslabel gleichzeitig verwendet werden.
* **Projects** → Die passende Zuordnung eines GitHub-Projekts für das Kanbansystem.
* **Milestones** → Die Version der Software, zu der dieses Problem gelöst werden muss.
Issues bearbeiten/lösen
^^^^^^^^^^^^^^^^^^^^^^^
In der Issue-Liste auf GitHub kann jeder sehen, was es aktuell zu tun gibt.
Vorzugsweise kümmert man sich um Issues auf dem eigenen Spezial- bzw. Aufgabengebiet. Wenn einem Issue bereits jemand zugeteilt ist, ist unbedingt Rücksprache zur betreffenden Person zu halten (Assignees).
Das eigentliche Lösen (im Regelfall Programmieren) erfolgt als feature-Branch (siehe unten).
Am Code arbeiten – Die Branches
-------------------------------
Der Hauptbranch ist der **dev**. In ihm ist immer die aktuelle Entwicklung von SchoolApps gespeichert. Er wird bei jeder stabilen Version im **server-Branch** veröffentlicht. Dieser stellt den aktuellen Stand auf dem Server da.
In keinem dieser Branches wird aktiv commited (Ausnahmen bestätigen die Regel), sie werden nur über **Pull Requests** „gefüttert“.
Alle Arbeiten am Code werden in vom dev-Branch abgezweigten Arbeits-Branches durchgeführt. Ein Branch entspricht dabei einer Funktion bzw. einem Issue. Wenn jemand gleichzeitig an mehreren, nicht zusammenhängend Issues arbeitet, wechselt dieser auch die Branches.
Die **Namenskonvention** für diesen Arbeits-Branch ist wie folgt:
* Ist die Änderung, die programmiert wird, ein neues Feature, so wird der Branch so benannt:
``feature/<der-name-des-feature-auf-englisch>`` (Bindestriche, kleingeschrieben)
* Ist die Änderung, die programmiert wird, ein Bugfix, so wird der Branch so benannt:
``bugfix/<beschreibung-des-bugs-auf-englisch>`` (Bindestriche, kleingeschrieben)
* Ist die Änderung, die programmiert wird, ein Code-Refactoring, so wird der Branch so benannt:
``refactor/<der-name-des-feature-auf-englisch>`` (Bindestriche, kleingeschrieben)
Am Code arbeiten – Committen
----------------------------
Nochmal zur Erinnerung: Es wird nur in feature-Branches direkt committed.
Die Commits erfolgen im Gegensatz zu Issues auf **englisch**, bei Bezug zu einem Issue wird das **Issue mit Hashtag** genannt.
Beispiel: ``Solve LDAP connection problems (issue #10)``
Am Code arbeiten – Mergen/Pull Requests
---------------------------------------
Ist man der Meinung, dass die Arbeiten am feature-Branch abgeschlossen sind, stellt man auf GitHub ein **Pull Request** und lässt die Arbeiten vom Rest des Entwicklerteams absegnen.
Dies ist unbedingt zu befolgen.
\ No newline at end of file
Development Guide
=================
Diese Anleitung soll für einen einheitliches Development und einheitlichen Code in SchoolApps sorgen.
Versionsverwaltung – Einsatz von Git
------------------------------------
Es wird mit **Git** gearbeitet. Die Verwendung ist Pflicht, die Regelungen im Git-Management Guide sind zu beachten. Alle Veränderungen sollten nach Beendigung der Arbeit an SchoolApps direkt im entsprechenden Featurebranch committed und gepusht werden, auch wenn sie noch nicht fertig oder lauffähig sind, um Datenverlust vorzubeugen (hierbei unbedingt den Bereich Branches im Git-Management Guide beachten).
Codestyle
---------
Grundsätzlich wird **auf englisch gecodet**: Englische Variablen, englische Kommentare und englische Commits. Die Oberfläche wird natürlich auf deutsch lokalisiert. Lediglich Issues auf GitHub und die Dokumentation werden auf deutsch verfasst.
Weiterhin gilt es, die **PEP-8-Richtlinien** der Python Foundation einzuhalten, sie sorgen für einen sauberen, einheitlichen und übersichtlichen Stil.
**Tipp:** Viele Editoren können die Pythonskripte auch automatisch nach PEP8 formatieren – meistens klappt das sehr gut (siehe auch „Editoren/IDEs“).
Editoren/IDEs
-------------
Natürlich kann man auch im Texteditor des jeweiligen Betriebssystemes oder in der IDLE von Python programmieren.
Allerdings empfiehlt es sich gerade bei so großen (Django-)Projekten wie SchoolApps einen vernünftigen **Editor** oder eine **IDE** (Integrated Development Environment) zu benutzen.
Folgende Software ist sehr empfehlenswert:
Atom
Ein Opensource-Editor von GitHub. Einfache Bedienung, gute Syntaxhervorhebung, mit Plugins auch Autovervollständigung und Codeformatierung
Visual Code
Ein Opensource-Projekt von Microsoft. Sehr ähnlich zu Atom.
PyCharm Community/Professional Edition
Kommerzielles Programm, gibt es in einer OpenSource-Version (Community) sowie einer Bezahlversion (Professional). Alle Funktionen von VisualCode und Atom enthalten, zudem wird in der Professional Edition Django von Haus aus unterstützt. TIPP: Die Professional Edition gibt es für den Bildungsbereich kostenlos.
Dokumentation
-------------
„It was hard to write, it should be hard to read.“
Alle Programmierer hassen es – dennoch ist **Kommentieren** die beste Dokumentationsmöglichkeit, damit andere Leute den eigenen Quellcode lesen können.
Alle Funktionen (Klassen, etc.) sollten mit Docstrings versehen sein. Docstrings werden nach dem folgenden Schema aufgebaut: https://sphinx-rtd-tutorial.readthedocs.io/en/latest/docstrings.html
Jede App, die sich in ihrer Funktion bzw. Funktionsweise nicht selbst erklärt, sollte eine **README** besitzen, die den Programmierer über Sinn und Zweck aufklärt. Dies gilt insbesondere, wenn diese App auch Funktionen für andere Apps bereitstellt. Diese sollten in der README gesondert erwähnt und sauber dokumentiert werden.
In der **Install.md** (im Wurzelverzeichnis) sollten alle Schritte zur Installation dokumentiert werden. Insbesondere gilt das, wenn man eine neue Bibliothek für eine bestimmte Funktionalität benötigt. Diese muss sofort aufgeführt werden, damit andere Entwickler den Code ohne großes Basteln zum Laufen bekommen.
Problem, Bug, Idee? – Issues verwenden!
---------------------------------------
Hier sei nochmal auf den Bereich „Issues“ im Git-Management Guide hingewiesen – unbedingt beachten!
\ No newline at end of file
Dokumentation von SchoolApps
======================================
.. toctree::
:maxdepth: 2
:caption: Inhalt:
api/dashboard
api/aub
dev/dev
dev/git
dev/doc
.. automodule:: untisconnect.api
:members:
.. automodule:: untisconnect.sub
:members:
Index
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
This diff is collapsed.
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: Georgia, serif;
font-size: 17px;
background-color: #fff;
color: #000;
margin: 0;
padding: 0;
}
div.document {
width: 940px;
margin: 30px auto 0 auto;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 220px;
}
div.sphinxsidebar {
width: 220px;
font-size: 14px;
line-height: 1.5;
}
hr {
border: 1px solid #B1B4B6;
}
div.body {
background-color: #fff;
color: #3E4349;
padding: 0 30px 0 30px;
}
div.body > .section {
text-align: left;
}
div.footer {
width: 940px;
margin: 20px auto 30px auto;
font-size: 14px;
color: #888;
text-align: right;
}
div.footer a {
color: #888;
}
p.caption {
font-family: inherit;
font-size: inherit;
}
div.relations {
display: none;
}
div.sphinxsidebar a {
color: #444;
text-decoration: none;
border-bottom: 1px dotted #999;
}
div.sphinxsidebar a:hover {
border-bottom: 1px solid #999;
}
div.sphinxsidebarwrapper {
padding: 18px 10px;
}
div.sphinxsidebarwrapper p.logo {
padding: 0;
margin: -10px 0 0 0px;
text-align: center;
}
div.sphinxsidebarwrapper h1.logo {
margin-top: -10px;
text-align: center;
margin-bottom: 5px;
text-align: left;
}
div.sphinxsidebarwrapper h1.logo-name {
margin-top: 0px;
}
div.sphinxsidebarwrapper p.blurb {
margin-top: 0;
font-style: normal;
}
div.sphinxsidebar h3,
div.sphinxsidebar h4 {
font-family: Georgia, serif;
color: #444;
font-size: 24px;
font-weight: normal;
margin: 0 0 5px 0;
padding: 0;
}
div.sphinxsidebar h4 {
font-size: 20px;
}
div.sphinxsidebar h3 a {
color: #444;
}
div.sphinxsidebar p.logo a,
div.sphinxsidebar h3 a,
div.sphinxsidebar p.logo a:hover,
div.sphinxsidebar h3 a:hover {
border: none;
}
div.sphinxsidebar p {
color: #555;
margin: 10px 0;
}
div.sphinxsidebar ul {
margin: 10px 0;
padding: 0;
color: #000;
}
div.sphinxsidebar ul li.toctree-l1 > a {
font-size: 120%;
}
div.sphinxsidebar ul li.toctree-l2 > a {
font-size: 110%;
}
div.sphinxsidebar input {
border: 1px solid #CCC;
font-family: Georgia, serif;
font-size: 1em;
}
div.sphinxsidebar hr {
border: none;
height: 1px;
color: #AAA;
background: #AAA;
text-align: left;
margin-left: 0;
width: 50%;
}
div.sphinxsidebar .badge {
border-bottom: none;
}
div.sphinxsidebar .badge:hover {
border-bottom: none;
}
/* To address an issue with donation coming after search */
div.sphinxsidebar h3.donation {
margin-top: 10px;
}
/* -- body styles ----------------------------------------------------------- */
a {
color: #004B6B;
text-decoration: underline;
}
a:hover {
color: #6D4100;
text-decoration: underline;
}
div.body h1,
div.body h2,
div.body h3,
div.body h4,
div.body h5,
div.body h6 {
font-family: Georgia, serif;
font-weight: normal;
margin: 30px 0px 10px 0px;
padding: 0;
}
div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
div.body h2 { font-size: 180%; }
div.body h3 { font-size: 150%; }
div.body h4 { font-size: 130%; }
div.body h5 { font-size: 100%; }
div.body h6 { font-size: 100%; }
a.headerlink {
color: #DDD;
padding: 0 4px;
text-decoration: none;
}
a.headerlink:hover {
color: #444;
background: #EAEAEA;
}
div.body p, div.body dd, div.body li {
line-height: 1.4em;
}
div.admonition {
margin: 20px 0px;
padding: 10px 30px;
background-color: #EEE;
border: 1px solid #CCC;
}
div.admonition tt.xref, div.admonition code.xref, div.admonition a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fafafa;
}
div.admonition p.admonition-title {
font-family: Georgia, serif;
font-weight: normal;
font-size: 24px;
margin: 0 0 10px 0;
padding: 0;
line-height: 1;
}
div.admonition p.last {
margin-bottom: 0;
}
div.highlight {
background-color: #fff;
}
dt:target, .highlight {
background: #FAF3E8;
}
div.warning {
background-color: #FCC;
border: 1px solid #FAA;
}
div.danger {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.error {
background-color: #FCC;
border: 1px solid #FAA;
-moz-box-shadow: 2px 2px 4px #D52C2C;
-webkit-box-shadow: 2px 2px 4px #D52C2C;
box-shadow: 2px 2px 4px #D52C2C;
}
div.caution {
background-color: #FCC;
border: 1px solid #FAA;
}
div.attention {
background-color: #FCC;
border: 1px solid #FAA;
}
div.important {
background-color: #EEE;
border: 1px solid #CCC;
}
div.note {
background-color: #EEE;
border: 1px solid #CCC;
}
div.tip {
background-color: #EEE;
border: 1px solid #CCC;
}
div.hint {
background-color: #EEE;
border: 1px solid #CCC;
}
div.seealso {
background-color: #EEE;
border: 1px solid #CCC;
}
div.topic {
background-color: #EEE;
}
p.admonition-title {
display: inline;
}
p.admonition-title:after {
content: ":";
}
pre, tt, code {
font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
font-size: 0.9em;
}
.hll {
background-color: #FFC;
margin: 0 -12px;
padding: 0 12px;
display: block;
}
img.screenshot {
}
tt.descname, tt.descclassname, code.descname, code.descclassname {
font-size: 0.95em;
}
tt.descname, code.descname {
padding-right: 0.08em;
}
img.screenshot {
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils {
border: 1px solid #888;
-moz-box-shadow: 2px 2px 4px #EEE;
-webkit-box-shadow: 2px 2px 4px #EEE;
box-shadow: 2px 2px 4px #EEE;
}
table.docutils td, table.docutils th {
border: 1px solid #888;
padding: 0.25em 0.7em;
}
table.field-list, table.footnote {
border: none;
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
table.footnote {
margin: 15px 0;
width: 100%;
border: 1px solid #EEE;
background: #FDFDFD;
font-size: 0.9em;
}
table.footnote + table.footnote {
margin-top: -15px;
border-top: none;
}
table.field-list th {
padding: 0 0.8em 0 0;
}
table.field-list td {
padding: 0;
}
table.field-list p {
margin-bottom: 0.8em;
}
/* Cloned from
* https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68
*/
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
table.footnote td.label {
width: .1px;
padding: 0.3em 0 0.3em 0.5em;
}
table.footnote td {
padding: 0.3em 0.5em;
}
dl {
margin: 0;
padding: 0;
}
dl dd {
margin-left: 30px;
}
blockquote {
margin: 0 0 0 30px;
padding: 0;
}
ul, ol {
/* Matches the 30px from the narrow-screen "li > ul" selector below */
margin: 10px 0 10px 30px;
padding: 0;
}
pre {
background: #EEE;
padding: 7px 30px;
margin: 15px 0px;
line-height: 1.3em;
}
div.viewcode-block:target {
background: #ffd;
}
dl pre, blockquote pre, li pre {
margin-left: 0;
padding-left: 30px;
}
tt, code {
background-color: #ecf0f3;
color: #222;
/* padding: 1px 2px; */
}
tt.xref, code.xref, a tt {
background-color: #FBFBFB;
border-bottom: 1px solid #fff;
}
a.reference {
text-decoration: none;
border-bottom: 1px dotted #004B6B;
}
/* Don't put an underline on images */
a.image-reference, a.image-reference:hover {
border-bottom: none;
}
a.reference:hover {
border-bottom: 1px solid #6D4100;
}
a.footnote-reference {
text-decoration: none;
font-size: 0.7em;
vertical-align: top;
border-bottom: 1px dotted #004B6B;
}
a.footnote-reference:hover {
border-bottom: 1px solid #6D4100;
}
a:hover tt, a:hover code {
background: #EEE;
}
@media screen and (max-width: 870px) {
div.sphinxsidebar {
display: none;
}
div.document {
width: 100%;
}
div.documentwrapper {
margin-left: 0;
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
}
div.bodywrapper {
margin-top: 0;
margin-right: 0;
margin-bottom: 0;
margin-left: 0;
}
ul {
margin-left: 0;
}
li > ul {
/* Matches the 30px from the "ul, ol" selector above */
margin-left: 30px;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.bodywrapper {
margin: 0;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
@media screen and (max-width: 875px) {
body {
margin: 0;
padding: 20px 30px;
}
div.documentwrapper {
float: none;
background: #fff;
}
div.sphinxsidebar {
display: block;
float: none;
width: 102.5%;
margin: 50px -30px -20px -30px;
padding: 10px 20px;
background: #333;
color: #FFF;
}
div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
div.sphinxsidebar h3 a {
color: #fff;
}
div.sphinxsidebar a {
color: #AAA;
}
div.sphinxsidebar p.logo {
display: none;
}
div.document {
width: 100%;
margin: 0;
}
div.footer {
display: none;
}
div.bodywrapper {
margin: 0;
}
div.body {
min-height: 0;
padding: 0;
}
.rtd_doc_footer {
display: none;
}
.document {
width: auto;
}
.footer {
width: auto;
}
.footer {
width: auto;
}
.github {
display: none;
}
}
/* misc. */
.revsys-inline {
display: none!important;
}
/* Make nested-list/multi-paragraph items look better in Releases changelog
* pages. Without this, docutils' magical list fuckery causes inconsistent
* formatting between different release sub-lists.
*/
div#changelog > div.section > ul > li > p:only-child {
margin-bottom: 0;
}
/* Hide fugly table cell borders in ..bibliography:: directive output */
table.docutils.citation, table.docutils.citation td, table.docutils.citation th {
border: none;
/* Below needed in some edge cases; if not applied, bottom shadows appear */
-moz-box-shadow: none;
-webkit-box-shadow: none;
box-shadow: none;
}
/* relbar */
.related {
line-height: 30px;
width: 100%;
font-size: 0.9rem;
}
.related.top {
border-bottom: 1px solid #EEE;
margin-bottom: 20px;
}
.related.bottom {
border-top: 1px solid #EEE;
}
.related ul {
padding: 0;
margin: 0;
list-style: none;
}
.related li {
display: inline;
}
nav#rellinks {
float: right;
}
nav#rellinks li+li:before {
content: "|";
}
nav#breadcrumbs li+li:before {
content: "\00BB";
}
/* Hide certain items when printing */
@media print {
div.related {
display: none;
}
}
\ No newline at end of file
/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px 7px 0 7px;
background-color: #ffe;
width: 40%;
float: right;
}
p.sidebar-title {
font-weight: bold;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px 7px 0 7px;
margin: 10px 0 10px 0;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
}
div.admonition dt {
font-weight: bold;
}
div.admonition dl {
margin-bottom: 0;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > p:first-child,
td > p:first-child {
margin-top: 0px;
}
th > p:last-child,
td > p:last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist td {
vertical-align: top;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
li > p:first-child {
margin-top: 0px;
}
li > p:last-child {
margin-bottom: 0px;
}
dl.footnote > dt,
dl.citation > dt {
float: left;
}
dl.footnote > dd,
dl.citation > dd {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > p:first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
td.linenos pre {
padding: 5px 0px;
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
margin-left: 0.5em;
}
table.highlighttable td {
padding: 0 0.5em 0 0.5em;
}
div.code-block-caption {
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
div.code-block-caption + div > div.highlight > pre {
margin-top: 0;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
padding: 1em 1em 0;
}
div.literal-block-wrapper div.highlight {
margin: 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: relative;
left: 0px;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}
\ No newline at end of file
/* This file intentionally left blank. */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment