Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • hansegucker/AlekSIS-Core
  • pinguin/AlekSIS-Core
  • AlekSIS/official/AlekSIS-Core
  • sunweaver/AlekSIS-Core
  • sggua/AlekSIS-Core
  • edward/AlekSIS-Core
  • magicfelix/AlekSIS-Core
7 results
Show changes
Commits on Source (12)
from django.utils.translation import gettext_lazy as _
def myplan_dashboard(request):
context = {
"title": _("My plan for today"),
}
return context
def calendar_dashboard(request):
context = {
"title": _("Current events"),
}
return context
def wordpress_dashboard(request):
context = {
"title": _("News "),
}
return context
WIDGETS = [
(_("Your plan"),)
]
......@@ -60,6 +60,7 @@ INSTALLED_APPS = [
"django_any_js",
"django_yarnpkg",
"django_tables2",
"include_by_ajax",
"easy_thumbnails",
"image_cropping",
"maintenance_mode",
......
......@@ -64,6 +64,7 @@ header, main, footer {
.brand-logo {
margin-left: 10px;
z-index: 5;
}
@media only screen and (max-width: 993px) {
......
......@@ -45,7 +45,7 @@
{% block extra_head %}{% endblock %}
</head>
<body>
<body id="body">
<header>
<!-- Menu button (sidenav) -->
......
{% extends 'core/base.html' %}
{% load i18n %}
{% load i18n static include_by_ajax_tags %}
{% block browser_title %}{% blocktrans %}Home{% endblocktrans %}{% endblock %}
{% block content %}
<p class="flow-text">{% blocktrans %}AlekSIS (School Information System){% endblocktrans %}</p>
{% if user.is_authenticated %}
{% for notification in unread_notifications %}
<div class="alert primary scale-transition">
<div>
<i class="material-icons left">info</i>
<div class="right">
<a class="btn-flat waves-effect" href="{% url "notification_mark_read" notification.id %}">
<i class="material-icons center">close</i>
</a>
</div>
<div id="dashboard">
<p class="flow-text">{% blocktrans %}AlekSIS (School Information System){% endblocktrans %}</p>
{% if user.is_authenticated %}
{% for notification in unread_notifications %}
<div class="alert primary scale-transition">
<div>
<i class="material-icons left">info</i>
<strong>{{ notification.title }}</strong>
<p>{{ notification.description }}</p>
<div class="right">
<a class="btn-flat waves-effect" href="{% url "notification_mark_read" notification.id %}">
<i class="material-icons center">close</i>
</a>
</div>
<strong>{{ notification.title }}</strong>
<p>{{ notification.description }}</p>
</div>
</div>
{% endfor %}
<div class="row">
{% for widget in widgets %}
<div class="col s12 m12 l6 xl4">
{# {{ widget }}#}
{% with widget.1 as d_widget %}
{% include_by_ajax "dashboardfeeds/rss.html" %}
{% endwith %}
</div>
{% endfor %}
</div>
{% endfor %}
<div class="row">
<div class="col s12 m6">
<h5>{% blocktrans %}Last activities{% endblocktrans %}</h5>
{% if activities %}
<ul class="collection">
{% for activity in activities %}
<li class="collection-item">
<span class="badge new primary-color">{{ activity.app }}</span>
<span class="title">{{ activity.title }}</span>
<p>
<i class="material-icons left">access_time</i> {{ activity.created_at }}
</p>
<p>
{{ activity.description }}
</p>
</li>
{% endfor %}
</ul>
{% else %}
<p>{% blocktrans %}No activities available yet.{% endblocktrans %}</p>
{% endif %}
</div>
<div class="col s12 m6">
<h5>{% blocktrans %}Recent notifications{% endblocktrans %}</h5>
{% if notifications %}
<ul class="collection">
{% for notification in notifications %}
<li class="collection-item">
<span class="badge new primary-color">{{ notification.app }}</span>
<span class="title">{{ notification.title }}</span>
<p>
<i class="material-icons left">access_time</i> {{ notification.created_at }}
</p>
<p>
{{ notification.description }}
</p>
{% if notification.link %}
<div class="row">
<div class="col s12 m6">
<h5>{% blocktrans %}Last activities{% endblocktrans %}</h5>
{% if activities %}
<ul class="collection">
{% for activity in activities %}
<li class="collection-item">
<span class="badge new primary-color">{{ activity.app }}</span>
<span class="title">{{ activity.title }}</span>
<p>
<i class="material-icons left">access_time</i> {{ activity.created_at }}
</p>
<p>
{{ activity.description }}
</p>
</li>
{% endfor %}
</ul>
{% else %}
<p>{% blocktrans %}No activities available yet.{% endblocktrans %}</p>
{% endif %}
</div>
<div class="col s12 m6">
<h5>{% blocktrans %}Recent notifications{% endblocktrans %}</h5>
{% if notifications %}
<ul class="collection">
{% for notification in notifications %}
<li class="collection-item">
<span class="badge new primary-color">{{ notification.app }}</span>
<span class="title">{{ notification.title }}</span>
<p>
<a href="{{ notification.link }}">{% blocktrans %}More information →{% endblocktrans %}</a>
<i class="material-icons left">access_time</i> {{ notification.created_at }}
</p>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>{% blocktrans %}No notifications available yet.{% endblocktrans %}</p>
{% endif %}
<p>
{{ notification.description }}
</p>
{% if notification.link %}
<p>
<a href="{{ notification.link }}">{% blocktrans %}More information →{% endblocktrans %}</a>
</p>
{% endif %}
</li>
{% endfor %}
</ul>
{% else %}
<p>{% blocktrans %}No notifications available yet.{% endblocktrans %}</p>
{% endif %}
</div>
</div>
</div>
{% endif %}
{% endif %}
</div>
<script src="{% static 'include_by_ajax/js/include_by_ajax.min.js' %}" defer></script>
<script type="text/javascript">
const asyncIntervals = [];
const runAsyncInterval = async (cb, interval, intervalIndex) => {
await cb();
if (asyncIntervals[intervalIndex]) {
setTimeout(() => runAsyncInterval(cb, interval, intervalIndex), interval);
}
};
const setAsyncInterval = (cb, interval) => {
if (cb && typeof cb === "function") {
const intervalIndex = asyncIntervals.length;
asyncIntervals.push(true);
runAsyncInterval(cb, interval, intervalIndex);
return intervalIndex;
} else {
throw new Error('Callback must be a function');
}
};
const clearAsyncInterval = (intervalIndex) => {
if (asyncIntervals[intervalIndex]) {
asyncIntervals[intervalIndex] = false;
}
};
/* SOURCE: https://dev.to/jsmccrumb/asynchronous-setinterval-4j69 */
{# ------------------------------------------ #}
{#$(document).ready(function () {#}
{# setInterval(function () {#}
{# $('#body').load("/");#}
{# }, 3000);#}
{# });#}
{# ------------------------------------------ #}
let dashboard_interval = setAsyncInterval(async () => {
console.log('fetching new data');
const promise = new Promise((resolve) => {
$('#dashboard').load("/?include_by_ajax_full_render=1 #dashboard");
resolve(1);
});
await promise;
console.log('data fetched successfully');
}, 15000);
$(document).on('include_by_ajax_all_loaded', function() {
console.log('Now all placeholders are loaded and replaced with content');
})
</script>
{% endblock %}
......@@ -5,8 +5,8 @@ from django.utils import timezone, formats
from ics import Calendar
from requests import RequestException
from dashboard import settings
from dashboard.caches import LATEST_ARTICLE_CACHE, CURRENT_EVENTS_CACHE
# from dashboard import settings
# from dashboard.caches import LATEST_ARTICLE_CACHE, CURRENT_EVENTS_CACHE
WP_DOMAIN: str = "https://katharineum-zu-luebeck.de"
......@@ -18,7 +18,8 @@ def get_newest_articles(domain: str = WP_DOMAIN,
author_whitelist: list = None,
author_blacklist: list = None,
category_whitelist: list = None,
category_blacklist: list = None
category_blacklist: list = None,
filter_vs_composer: bool = False,
):
"""
This function returns the newest articles/posts of a WordPress site.
......@@ -29,6 +30,7 @@ def get_newest_articles(domain: str = WP_DOMAIN,
:param author_blacklist: If the author's id (an integer) is in this list, the article won't be shown
:param category_whitelist: If this list is filled, only articles which are in one of this categories will be shown
:param category_blacklist: If the category's id (an integer) is in this list, the article won't be shown
:param filter_vs_composer: Remove unnecessary Visual Composer Tags
:return: a list of the newest posts/articles
"""
# Make mutable default arguments unmutable
......@@ -68,7 +70,7 @@ def get_newest_articles(domain: str = WP_DOMAIN,
image_url: str = ""
# Replace VS composer tags if activated
if settings.latest_article_settings.replace_vs_composer_stuff:
if filter_vs_composer:
excerpt = VS_COMPOSER_REGEX.sub("", post["excerpt"]["rendered"])
else:
excerpt = post["excerpt"]["rendered"]
......@@ -81,13 +83,13 @@ def get_newest_articles(domain: str = WP_DOMAIN,
"image_url": image_url,
}
)
if len(posts) >= limit and limit >= 0:
if len(posts) >= limit >= 0:
break
return posts
@LATEST_ARTICLE_CACHE.decorator
# @LATEST_ARTICLE_CACHE.decorator
def get_newest_article_from_news(domain=WP_DOMAIN):
newest_articles: list = get_newest_articles(domain=domain, limit=1, category_whitelist=[1, 27])
if len(newest_articles) > 0:
......@@ -149,7 +151,7 @@ def get_current_events(calendar: Calendar, limit: int = 5) -> list:
return events
@CURRENT_EVENTS_CACHE.decorator
# @CURRENT_EVENTS_CACHE.decorator
def get_current_events_with_cal(limit: int = 5) -> list:
# Get URL
calendar_url: str = settings.current_events_settings.calendar_url
......
......@@ -20,19 +20,23 @@ from .models import Activity, Group, Notification, Person, School
from .tables import GroupsTable, PersonsTable
from .util import messages
from aleksis.apps.dashboardfeeds.views import get_widgets
@person_required
def index(request: HttpRequest) -> HttpResponse:
context = {}
activities = request.user.person.activities.all()[:5]
notifications = request.user.person.notifications.all()[:5]
unread_notifications = request.user.person.notifications.all().filter(read=False)
activities = request.user.person.activities.all().order_by('-created_at')[:5]
notifications = request.user.person.notifications.all().order_by('-created_at')[:5]
unread_notifications = request.user.person.notifications.all().filter(read=False).order_by('-created_at')
context["activities"] = activities
context["notifications"] = notifications
context["unread_notifications"] = unread_notifications
context["widgets"] = get_widgets(request)
return render(request, "core/index.html", context)
......@@ -255,7 +259,7 @@ def notification_mark_read(request: HttpRequest, id_: int) -> HttpResponse:
notification = get_object_or_404(Notification, pk=id_)
if notification.recipient.user == request.user:
if notification.user == request.user.person:
notification.read = True
notification.save()
else:
......
AlekSIS-App-Hjelp @ 1415a485
Subproject commit 1415a4851bd53ffe4e14c0961422e5b66060d0f8
......@@ -25,6 +25,17 @@ optional = false
python-versions = "*"
version = "1.4.3"
[[package]]
category = "main"
description = "Better dates & times for Python"
name = "arrow"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "0.14.7"
[package.dependencies]
python-dateutil = "*"
[[package]]
category = "main"
description = "ASGI specs, helper code, and adapters"
......@@ -134,7 +145,7 @@ description = "Utilities for working with calendar weeks in Python and Django"
name = "calendarweek"
optional = false
python-versions = ">=3.7,<4.0"
version = "0.4.4"
version = "0.4.5"
[package.extras]
django = ["Django (>=2.2,<4.0)"]
......@@ -247,6 +258,9 @@ optional = false
python-versions = "*"
version = "5.0.6"
[package.dependencies]
six = "*"
[[package]]
category = "dev"
description = "Code coverage measurement for Python"
......@@ -395,11 +409,6 @@ optional = false
python-versions = "*"
version = "2.5.0"
[package.dependencies]
[package.dependencies.django-picklefield]
optional = true
version = "*"
[package.extras]
database = ["django-picklefield"]
redis = ["redis"]
......@@ -408,6 +417,7 @@ redis = ["redis"]
reference = "590fa02eb30e377da0eda5cc3a84254b839176a7"
type = "git"
url = "https://github.com/jazzband/django-constance"
[[package]]
category = "main"
description = "A configurable set of panels that display various debug information about the current request/response."
......@@ -426,7 +436,7 @@ description = "Yet another Django audit log app, hopefully the simplest one."
name = "django-easy-audit"
optional = false
python-versions = "*"
version = "1.2rc1"
version = "1.2.1rc1"
[package.dependencies]
beautifulsoup4 = "*"
......@@ -487,6 +497,17 @@ optional = false
python-versions = "*"
version = "1.4.1"
[[package]]
category = "main"
description = "A Django App Providing the `{% include_by_ajax %}` Template Tag"
name = "django-include-by-ajax"
optional = false
python-versions = "*"
version = "2.0.0"
[package.dependencies]
Django = ">=1.8"
[[package]]
category = "main"
description = "A Django utility application that returns client's real IP address"
......@@ -604,10 +625,6 @@ version = "3.0.1"
Django = ">=1.11.3"
babel = "*"
[package.dependencies.phonenumbers]
optional = true
version = ">=7.0.2"
[package.extras]
phonenumbers = ["phonenumbers (>=7.0.2)"]
phonenumberslite = ["phonenumberslite (>=7.0.2)"]
......@@ -632,7 +649,7 @@ description = "A Django app to include a manifest.json and Service Worker instan
name = "django-pwa"
optional = false
python-versions = "*"
version = "1.0.6"
version = "1.0.7"
[package.dependencies]
django = ">=1.8"
......@@ -1048,6 +1065,20 @@ optional = false
python-versions = ">=3.5"
version = "2020.1.16"
[[package]]
category = "main"
description = "Python icalendar (rfc5545) parser"
name = "ics"
optional = false
python-versions = "*"
version = "0.6"
[package.dependencies]
arrow = ">=0.11,<0.15"
python-dateutil = "*"
six = ">1.5"
tatsu = ">4.2"
[[package]]
category = "main"
description = "Internationalized Domain Names in Applications (IDNA)"
......@@ -1167,7 +1198,7 @@ python-versions = "*"
version = "0.6.1"
[[package]]
category = "main"
category = "dev"
description = "More routines for operating on iterables, beyond itertools"
name = "more-itertools"
optional = false
......@@ -1204,7 +1235,7 @@ description = "Core utilities for Python packages"
name = "packaging"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
version = "20.0"
version = "20.1"
[package.dependencies]
pyparsing = ">=2.0.2"
......@@ -1374,7 +1405,7 @@ description = "pytest: simple powerful testing with Python"
name = "pytest"
optional = false
python-versions = ">=3.5"
version = "5.3.3"
version = "5.3.4"
[package.dependencies]
atomicwrites = ">=1.0"
......@@ -1533,7 +1564,7 @@ category = "main"
description = "YAML parser and emitter for Python"
name = "pyyaml"
optional = false
python-versions = "*"
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
version = "5.3"
[[package]]
......@@ -1742,7 +1773,7 @@ description = "Improve the Sphinx autodoc for Django classes."
name = "sphinxcontrib-django"
optional = false
python-versions = "*"
version = "0.5"
version = "0.5.1"
[[package]]
category = "dev"
......@@ -1808,6 +1839,17 @@ version = "1.31.0"
pbr = ">=2.0.0,<2.1.0 || >2.1.0"
six = ">=1.10.0"
[[package]]
category = "main"
description = "TatSu takes a grammar in a variation of EBNF as input, and outputs a memoizing PEG/Packrat parser in Python."
name = "tatsu"
optional = false
python-versions = "*"
version = "4.4.0"
[package.extras]
future-regex = ["regex"]
[[package]]
category = "dev"
description = "ANSII Color formatting for output in terminal."
......@@ -1877,7 +1919,7 @@ description = "Fast, Extensible Progress Meter"
name = "tqdm"
optional = false
python-versions = ">=2.6, !=3.0.*, !=3.1.*"
version = "4.41.1"
version = "4.42.0"
[package.extras]
dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"]
......@@ -1888,7 +1930,7 @@ description = "Twilio API client and TwiML generator"
name = "twilio"
optional = false
python-versions = "*"
version = "6.35.2"
version = "6.35.3"
[package.dependencies]
PyJWT = ">=1.4.2"
......@@ -1920,8 +1962,8 @@ category = "main"
description = "HTTP library with thread-safe connection pooling, file post, and more."
name = "urllib3"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4"
version = "1.25.7"
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4"
version = "1.25.8"
[package.extras]
brotli = ["brotlipy (>=0.6.0)"]
......@@ -1962,22 +2004,19 @@ description = "Backport of pathlib-compatible object wrapper for zip files"
marker = "python_version < \"3.8\""
name = "zipp"
optional = false
python-versions = ">=2.7"
version = "1.0.0"
[package.dependencies]
more-itertools = "*"
python-versions = ">=3.6"
version = "2.1.0"
[package.extras]
docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"]
testing = ["pathlib2", "contextlib2", "unittest2"]
testing = ["jaraco.itertools"]
[extras]
celery = ["Celery", "django-celery-results", "django-celery-beat", "django-celery-email"]
ldap = ["django-auth-ldap"]
[metadata]
content-hash = "61847d3ffe7092e41f9ad04eadf9056fc09b6682cc945dce4544020a6b2f1712"
content-hash = "200c59b4623fdac33a7c5f63a9df19b14ae1d7e46b22780f874e4edab9690243"
python-versions = "^3.7"
[metadata.files]
......@@ -1993,6 +2032,10 @@ appdirs = [
{file = "appdirs-1.4.3-py2.py3-none-any.whl", hash = "sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e"},
{file = "appdirs-1.4.3.tar.gz", hash = "sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92"},
]
arrow = [
{file = "arrow-0.14.7-py2.py3-none-any.whl", hash = "sha256:4bfacea734ead51495dc47df00421ecfd4ca1f2c0fbe58b9a26eaeddedc31caf"},
{file = "arrow-0.14.7.tar.gz", hash = "sha256:67f8be7c0cf420424bc62d8d7dc40b44e4bb2f7b515f9cc2954fb36e35797656"},
]
asgiref = [
{file = "asgiref-3.2.3-py2.py3-none-any.whl", hash = "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5"},
{file = "asgiref-3.2.3.tar.gz", hash = "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0"},
......@@ -2027,8 +2070,8 @@ black = [
{file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"},
]
calendarweek = [
{file = "calendarweek-0.4.4-py3-none-any.whl", hash = "sha256:6510a42015558f140ed6677e79efbb45d8bf87ccded069db4026283eb639a256"},
{file = "calendarweek-0.4.4.tar.gz", hash = "sha256:02f092ec54ebe162dc9f3614de6efbf3d7fb35115e8ca5d62e99d65c342f5732"},
{file = "calendarweek-0.4.5-py3-none-any.whl", hash = "sha256:b35fcc087073969d017cede62a7295bcd714a1304bcb4c4e2b0f23acb0265fb1"},
{file = "calendarweek-0.4.5.tar.gz", hash = "sha256:5b1788ca435022f9348fc81a718974e51dd85d080f9aa3dad717df70a1bc6e1f"},
]
celery = [
{file = "celery-4.4.0-py2.py3-none-any.whl", hash = "sha256:7c544f37a84a5eadc44cab1aa8c9580dff94636bb81978cdf9bf8012d9ea7d8f"},
......@@ -2139,8 +2182,8 @@ django-debug-toolbar = [
{file = "django_debug_toolbar-2.1-py3-none-any.whl", hash = "sha256:77cfba1d6e91b9bc3d36dc7dc74a9bb80be351948db5f880f2562a0cbf20b6c5"},
]
django-easy-audit = [
{file = "django-easy-audit-1.2rc1.tar.gz", hash = "sha256:80f82fa4006290dcd6589a345e75de1c780de49d38218050eedd9048c54b647d"},
{file = "django_easy_audit-1.2rc1-py3-none-any.whl", hash = "sha256:fb9c5ec3e90f0900302448d3648acc11da6d6b3d35d13d77eab917ab8c813d77"},
{file = "django-easy-audit-1.2.1rc1.tar.gz", hash = "sha256:a127264dbfef4aac17bfa74439487540ad41e47ff4c067d3d77bfad82fd23bc5"},
{file = "django_easy_audit-1.2.1rc1-py3-none-any.whl", hash = "sha256:00e9a9bc063ad73120fe399f2e7bc216af5fc32186dc5eccad09e2c4cd10abc1"},
]
django-filter = [
{file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"},
......@@ -2160,6 +2203,10 @@ django-image-cropping = [
django-impersonate = [
{file = "django-impersonate-1.4.1.tar.gz", hash = "sha256:63b62d06f93b0318698c68f7314c78473914c262d4164eb66ad860bb83e04771"},
]
django-include-by-ajax = [
{file = "django-include-by-ajax-2.0.0.tar.gz", hash = "sha256:d555439e9794fc6b04bc9c248a3d6ae60fe9231541dc73dc037ea8299cf630d6"},
{file = "django_include_by_ajax-2.0.0-py2.py3-none-any.whl", hash = "sha256:5b3ea4086403ca01997e38fbe1bbfc7cb9180e640b8bb4269fac8524550c1928"},
]
django-ipware = [
{file = "django-ipware-2.1.0.tar.gz", hash = "sha256:a7c7a8fd019dbdc9c357e6e582f65034e897572fc79a7e467674efa8aef9d00b"},
]
......@@ -2205,8 +2252,8 @@ django-picklefield = [
{file = "django_picklefield-2.0-py2.py3-none-any.whl", hash = "sha256:9052f2dcf4882c683ce87b4356f29b4d014c0dad645b6906baf9f09571f52bc8"},
]
django-pwa = [
{file = "django-pwa-1.0.6.tar.gz", hash = "sha256:b3f1ad0c5241fae4c7505423540de4db93077d7c88416ff6d2af545ffe209f34"},
{file = "django_pwa-1.0.6-py3-none-any.whl", hash = "sha256:9306105fcb637ae16fea6527be4b147d45fd53db85efb1d4f61dfea6bf793e56"},
{file = "django-pwa-1.0.7.tar.gz", hash = "sha256:a7670949036f627ae702805aee9c184c1319b377a3cc763a348e5f03c9bf2e37"},
{file = "django_pwa-1.0.7-py3-none-any.whl", hash = "sha256:a972283a6befc67560ab35d118d12b487976c34812dcab13b219e76f9232a530"},
]
django-render-block = [
{file = "django_render_block-0.6-py2.py3-none-any.whl", hash = "sha256:95c7dc9610378a10e0c4a10d8364ec7307210889afccd6a67a6aaa0fd599bd4d"},
......@@ -2322,6 +2369,10 @@ html2text = [
{file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"},
{file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"},
]
ics = [
{file = "ics-0.6-py2.py3-none-any.whl", hash = "sha256:12cf34aed0dafa1bf99d79ca58e99949d6721511b856386e118015fe5f5d6e3a"},
{file = "ics-0.6-py3.7.egg", hash = "sha256:daa457478dbaba3ce7ab5f7b3a411e72d7a2771c0781c21013cc6c9f27b2a050"},
]
idna = [
{file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"},
{file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"},
......@@ -2423,8 +2474,8 @@ mypy-extensions = [
{file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
]
packaging = [
{file = "packaging-20.0-py2.py3-none-any.whl", hash = "sha256:aec3fdbb8bc9e4bb65f0634b9f551ced63983a529d6a8931817d52fdd0816ddb"},
{file = "packaging-20.0.tar.gz", hash = "sha256:fe1d8331dfa7cc0a883b49d75fc76380b2ab2734b220fbb87d774e4fd4b851f8"},
{file = "packaging-20.1-py2.py3-none-any.whl", hash = "sha256:170748228214b70b672c581a3dd610ee51f733018650740e98c7df862a583f73"},
{file = "packaging-20.1.tar.gz", hash = "sha256:e665345f9eef0c621aa0bf2f8d78cf6d21904eef16a93f020240b704a57f1334"},
]
pathspec = [
{file = "pathspec-0.7.0-py2.py3-none-any.whl", hash = "sha256:163b0632d4e31cef212976cf57b43d9fd6b0bac6e67c26015d611a647d5e7424"},
......@@ -2578,8 +2629,8 @@ pyparsing = [
{file = "pyparsing-2.4.6.tar.gz", hash = "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"},
]
pytest = [
{file = "pytest-5.3.3-py3-none-any.whl", hash = "sha256:9f8d44f4722b3d06b41afaeb8d177cfbe0700f8351b1fc755dd27eedaa3eb9e0"},
{file = "pytest-5.3.3.tar.gz", hash = "sha256:f5d3d0e07333119fe7d4af4ce122362dc4053cdd34a71d2766290cf5369c64ad"},
{file = "pytest-5.3.4-py3-none-any.whl", hash = "sha256:c13d1943c63e599b98cf118fcb9703e4d7bde7caa9a432567bcdcae4bf512d20"},
{file = "pytest-5.3.4.tar.gz", hash = "sha256:1d122e8be54d1a709e56f82e2d85dcba3018313d64647f38a91aec88c239b600"},
]
pytest-cov = [
{file = "pytest-cov-2.8.1.tar.gz", hash = "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b"},
......@@ -2719,8 +2770,8 @@ sphinxcontrib-devhelp = [
{file = "sphinxcontrib_devhelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981"},
]
sphinxcontrib-django = [
{file = "sphinxcontrib-django-0.5.tar.gz", hash = "sha256:95831d5d58f780010b0255f298ea03d6bbf971c0f94f631268abd4320400b7db"},
{file = "sphinxcontrib_django-0.5-py2.py3-none-any.whl", hash = "sha256:f5bb52d20b64b51087b44247789adaebfc51fa2fad71bfed42c4ca6c05723838"},
{file = "sphinxcontrib-django-0.5.1.tar.gz", hash = "sha256:3b48a9067d8db4713d47e3a4160af10288d02d448c866d1b44b001adbe74cc1e"},
{file = "sphinxcontrib_django-0.5.1-py2.py3-none-any.whl", hash = "sha256:73ef7fdbf2ed6d4f35b7ae709032bd5ac493d93cedd0624ea7b51bf5fce41267"},
]
sphinxcontrib-htmlhelp = [
{file = "sphinxcontrib-htmlhelp-1.0.2.tar.gz", hash = "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422"},
......@@ -2746,6 +2797,10 @@ stevedore = [
{file = "stevedore-1.31.0-py2.py3-none-any.whl", hash = "sha256:01d9f4beecf0fbd070ddb18e5efb10567801ba7ef3ddab0074f54e3cd4e91730"},
{file = "stevedore-1.31.0.tar.gz", hash = "sha256:e0739f9739a681c7a1fda76a102b65295e96a144ccdb552f2ae03c5f0abe8a14"},
]
tatsu = [
{file = "TatSu-4.4.0-py2.py3-none-any.whl", hash = "sha256:c9211eeee9a2d4c90f69879ec0b518b1aa0d9450249cb0dd181f5f5b18be0a92"},
{file = "TatSu-4.4.0.zip", hash = "sha256:80713413473a009f2081148d0f494884cabaf9d6866b71f2a68a92b6442f343d"},
]
termcolor = [
{file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"},
]
......@@ -2771,11 +2826,11 @@ toml = [
{file = "toml-0.10.0.tar.gz", hash = "sha256:229f81c57791a41d65e399fc06bf0848bab550a9dfd5ed66df18ce5f05e73d5c"},
]
tqdm = [
{file = "tqdm-4.41.1-py2.py3-none-any.whl", hash = "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb"},
{file = "tqdm-4.41.1.tar.gz", hash = "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"},
{file = "tqdm-4.42.0-py2.py3-none-any.whl", hash = "sha256:01464d5950e9a07a8e463c2767883d9616c099c6502f6c7ef4e2e11d3065bd35"},
{file = "tqdm-4.42.0.tar.gz", hash = "sha256:5865f5fef9d739864ff341ddaa69894173ebacedb1aaafcf014de56343d01d5c"},
]
twilio = [
{file = "twilio-6.35.2.tar.gz", hash = "sha256:a086443642c0e1f13c8f8f087b426ca81ec883efbe496d8279180a49bb9287bc"},
{file = "twilio-6.35.3.tar.gz", hash = "sha256:4474fa87fde5ea5526e296be782d1b06fc6722f9e4698a503c47b5c2f8b70ea9"},
]
typed-ast = [
{file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"},
......@@ -2806,8 +2861,8 @@ typing-extensions = [
{file = "typing_extensions-3.7.4.1.tar.gz", hash = "sha256:091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2"},
]
urllib3 = [
{file = "urllib3-1.25.7-py2.py3-none-any.whl", hash = "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293"},
{file = "urllib3-1.25.7.tar.gz", hash = "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745"},
{file = "urllib3-1.25.8-py2.py3-none-any.whl", hash = "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc"},
{file = "urllib3-1.25.8.tar.gz", hash = "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"},
]
vine = [
{file = "vine-1.3.0-py2.py3-none-any.whl", hash = "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af"},
......@@ -2821,6 +2876,6 @@ yubiotp = [
{file = "YubiOTP-0.2.2.post1.tar.gz", hash = "sha256:de83b1560226e38b5923f6ab919f962c8c2abb7c722104cb45b2b6db2ac86e40"},
]
zipp = [
{file = "zipp-1.0.0-py2.py3-none-any.whl", hash = "sha256:8dda78f06bd1674bd8720df8a50bb47b6e1233c503a4eed8e7810686bde37656"},
{file = "zipp-1.0.0.tar.gz", hash = "sha256:d38fbe01bbf7a3593a32bc35a9c4453c32bc42b98c377f9bff7e9f8da157786c"},
{file = "zipp-2.1.0-py3-none-any.whl", hash = "sha256:ccc94ed0909b58ffe34430ea5451f07bc0c76467d7081619a454bf5c98b89e28"},
{file = "zipp-2.1.0.tar.gz", hash = "sha256:feae2f18633c32fc71f2de629bfb3bd3c9325cd4419642b1f1da42ee488d9b98"},
]
......@@ -63,6 +63,8 @@ django-celery-results = {version="^1.1.2", optional=true}
django-celery-beat = {version="^1.5.0", optional=true}
django-celery-email = {version="^3.0.0", optional=true}
django-jsonstore = "^0.4.1"
ics = "^0.6"
django-include-by-ajax = "^2.0.0"
[tool.poetry.extras]
ldap = ["django-auth-ldap"]
......