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
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/.gitignore
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/.gitignore (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/.gitignore (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,74 @@
+# Byte-compiled / optimized / DLL files
+*$py.class
+*.py[cod]
+__pycache__/
+
+# Distribution / packaging
+*.egg
+*.egg-info/
+.Python
+.eggs/
+.installed.cfg
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+
+# Installer logs
+pip-delete-this-directory.txt
+pip-log.txt
+
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+
+# pyenv
+.python-version
+
+# Environments
+.env
+.venv
+ENV/
+env/
+venv/
+
+# Editors
+*~
+DEADJOE
+\#*#
+
+# IntelliJ
+.idea
+.idea/
+
+# Database
+db.sqlite3
+
+# Sphinx
+docs/_build/
+
+# TeX
+*.aux
+
+# Generated files
+aleksis/node_modules/
+aleksis/static/
+
+.coverage
+.mypy_cache/
+.tox/
+htmlcov/
+maintenance_mode_state.txt
+media/
+package-lock.json
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/CHANGELOG.rst
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/CHANGELOG.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/CHANGELOG.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,22 @@
+Changelog
+=========
+
+`1.0`_
+------
+
+New features
+~~~~~~~~~~~~
+
+* Initial release
+
+Bugfixes
+~~~~~~~~
+
+* None
+
+Minor changes
+~~~~~~~~~~~~~
+
+* None
+
+_`1.0`: https://edugit.org/Teckids/AlekSIS/AlekSIS-App-DashboardFeeds/-/tags/1.0
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/LICENCE.rst
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/LICENCE.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/LICENCE.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,318 @@
+======================================
+ EUROPEAN UNION PUBLIC LICENCE v. 1.2
+======================================
+--------------------------------------
+ EUPL © the European Union 2007, 2016
+--------------------------------------
+
+This European Union Public Licence (the ‘EUPL’) applies to the Work
+(as defined below) which is provided under the terms of this Licence.
+Any use of the Work, other than as authorised under this Licence is
+prohibited (to the extent such use is covered by a right of the
+copyright holder of the Work).
+
+The Work is provided under the terms of this Licence when the Licensor
+(as defined below) has placed the following notice immediately following
+the copyright notice for the Work:
+
+ Licensed under the EUPL
+
+or has expressed by any other means his willingness to license under
+the EUPL.
+
+1. Definitions
+==============
+
+In this Licence, the following terms have the following meaning:
+
+* ‘The Licence’: this Licence.
+* ‘The Original Work’: the work or software distributed or communicated
+ by the Licensor under this Licence, available as Source Code and also
+ as Executable Code as the case may be.
+* ‘Derivative Works’: the works or software that could be created by the
+ Licensee, based upon the Original Work or modifications thereof. This
+ Licence does not define the extent of modification or dependence on
+ the Original Work required in order to classify a work as a Derivative
+ Work; this extent is determined by copyright law applicable in the
+ country mentioned in Article 15.
+* ‘The Work’: the Original Work or its Derivative Works.
+* ‘The Source Code’: the human-readable form of the Work which is the
+ most convenient for people to study and modify.
+* ‘The Executable Code’: any code which has generally been compiled and
+ which is meant to be interpreted by a computer as a program.
+* ‘The Licensor’: the natural or legal person that distributes or
+ communicates the Work under the Licence.
+* ‘Contributor(s)’: any natural or legal person who modifies the Work
+ under the Licence, or otherwise contributes to the creation of a
+ Derivative Work.
+* ‘The Licensee’ or ‘You’: any natural or legal person who makes any
+ usage of the Work under the terms of the Licence.
+* ‘Distribution’ or ‘Communication’: any act of selling, giving,
+ lending, renting, distributing, communicating, transmitting, or
+ otherwise making available, online or offline, copies of the Work or
+ providing access to its essential functionalities at the disposal of
+ any other natural or legal person.
+
+2. Scope of the rights granted by the Licence
+=============================================
+
+The Licensor hereby grants You a worldwide, royalty-free, non-exclusive,
+sublicensable licence to do the following, for the duration of copyright
+vested in the Original Work:
+
+* use the Work in any circumstance and for all usage,
+* reproduce the Work,
+* modify the Work, and make Derivative Works based upon the Work,
+* communicate to the public, including the right to make available or
+ display the Work or copies thereof to the public and perform publicly,
+ as the case may be, the Work,
+* distribute the Work or copies thereof,
+* lend and rent the Work or copies thereof,
+* sublicense rights in the Work or copies thereof.
+
+Those rights can be exercised on any media, supports and formats,
+whether now known or later invented, as far as the applicable law
+permits so.
+
+In the countries where moral rights apply, the Licensor waives his right
+to exercise his moral right to the extent allowed by law in order to
+make effective the licence of the economic rights here above listed.
+
+The Licensor grants to the Licensee royalty-free, non-exclusive usage
+rights to any patents held by the Licensor, to the extent necessary to
+make use of the rights granted on the Work under this Licence.
+
+3. Communication of the Source Code
+===================================
+
+The Licensor may provide the Work either in its Source Code form, or as
+Executable Code. If the Work is provided as Executable Code, the
+Licensor provides in addition a machine-readable copy of the Source Code
+of the Work along with each copy of the Work that the Licensor
+distributes or indicates, in a notice following the copyright notice
+attached to the Work, a repository where the Source Code is easily and
+freely accessible for as long as the Licensor continues to distribute or
+communicate the Work.
+
+4. Limitations on copyright
+===========================
+
+Nothing in this Licence is intended to deprive the Licensee of the
+benefits from any exception or limitation to the exclusive rights of the
+rights owners in the Work, of the exhaustion of those rights or of other
+applicable limitations thereto.
+
+5. Obligations of the Licensee
+==============================
+
+The grant of the rights mentioned above is subject to some restrictions
+and obligations imposed on the Licensee. Those obligations are the
+following:
+
+*Attribution right*: The Licensee shall keep intact all copyright,
+patent or trademarks notices and all notices that refer to the Licence
+and to the disclaimer of warranties. The Licensee must include a copy
+of such notices and a copy of the Licence with every copy of the Work
+he/she distributes or communicates. The Licensee must cause any
+Derivative Work to carry prominent notices stating that the Work has
+been modified and the date of modification.
+
+*Copyleft clause*: If the Licensee distributes or communicates copies
+of the Original Works or Derivative Works, this Distribution or
+Communication will be done under the terms of this Licence or of a
+later version of this Licence unless the Original Work is expressly
+distributed only under this version of the Licence — for example by
+communicating ‘EUPL v. 1.2 only’. The Licensee (becoming Licensor)
+cannot offer or impose any additional terms or conditions on the Work
+or Derivative Work that alter or restrict the terms of the Licence.
+
+*Compatibility clause*: If the Licensee Distributes or Communicates
+Derivative Works or copies thereof based upon both the Work and another
+work licensed under a Compatible Licence, this Distribution or
+Communication can be done under the terms of this Compatible Licence.
+For the sake of this clause, ‘Compatible Licence’ refers to the licences
+listed in the appendix attached to this Licence. Should the Licensee’s
+obligations under the Compatible Licence conflict with his/her
+obligations under this Licence, the obligations of the Compatible
+Licence shall prevail.
+
+*Provision of Source Code*: When distributing or communicating copies
+of the Work, the Licensee will provide a machine-readable copy of the
+Source Code or indicate a repository where this Source will be easily
+and freely available for as long as the Licensee continues to distribute
+or communicate the Work. Legal Protection: This Licence does not grant
+permission to use the trade names, trademarks, service marks, or names
+of the Licensor, except as required for reasonable and customary use
+in describing the origin of the Work and reproducing the content of
+the copyright notice.
+
+6. Chain of Authorship
+======================
+
+The original Licensor warrants that the copyright in the Original Work
+granted hereunder is owned by him/her or licensed to him/her and that
+he/she has the power and authority to grant the Licence.
+
+Each Contributor warrants that the copyright in the modifications he/she
+brings to the Work are owned by him/her or licensed to him/her and that
+he/she has the power and authority to grant the Licence.
+
+Each time You accept the Licence, the original Licensor and subsequent
+Contributors grant You a licence to their contributions to the Work,
+under the terms of this Licence.
+
+7. Disclaimer of Warranty
+=========================
+
+The Work is a work in progress, which is continuously improved by
+numerous Contributors. It is not a finished work and may therefore
+contain defects or ‘bugs’ inherent to this type of development. For
+the above reason, the Work is provided under the Licence on an ‘as is’
+basis and without warranties of any kind concerning the Work, including
+without limitation merchantability, fitness for a particular purpose,
+absence of defects or errors, accuracy, non-infringement of intellectual
+property rights other than copyright as stated in Article 6 of this
+Licence.
+
+This disclaimer of warranty is an essential part of the Licence and a
+condition for the grant of any rights to the Work.
+
+8. Disclaimer of Liability
+==========================
+
+Except in the cases of wilful misconduct or damages directly caused to
+natural persons, the Licensor will in no event be liable for any direct
+or indirect, material or moral, damages of any kind, arising out of the
+Licence or of the use of the Work, including without limitation, damages
+for loss of goodwill, work stoppage, computer failure or malfunction,
+loss of data or any commercial damage, even if the Licensor has been
+advised of the possibility of such damage. However, the Licensor will be
+liable under statutory product liability laws as far such laws apply to
+the Work.
+
+9. Additional agreements
+========================
+
+While distributing the Work, You may choose to conclude an additional
+agreement, defining obligations or services consistent with this
+Licence. However, if accepting obligations, You may act only on your own
+behalf and on your sole responsibility, not on behalf of the original
+Licensor or any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability incurred
+by, or claims asserted against such Contributor by the fact You have
+accepted any warranty or additional liability.
+
+10. Acceptance of the Licence
+=============================
+
+The provisions of this Licence can be accepted by clicking on an icon
+‘I agree’ placed under the bottom of a window displaying the text of
+this Licence or by affirming consent in any other similar way, in
+accordance with the rules of applicable law. Clicking on that icon
+indicates your clear and irrevocable acceptance of this Licence and
+all of its terms and conditions.
+
+Similarly, you irrevocably accept this Licence and all of its terms
+and conditions by exercising any rights granted to You by Article 2
+of this Licence, such as the use of the Work, the creation by You of
+a Derivative Work or the Distribution or Communication by You of the
+Work or copies thereof.
+
+11. Information to the public
+=============================
+
+In case of any Distribution or Communication of the Work by means of
+electronic communication by You (for example, by offering to download
+the Work from a remote location) the distribution channel or media (for
+example, a website) must at least provide to the public the information
+requested by the applicable law regarding the Licensor, the Licence and
+the way it may be accessible, concluded, stored and reproduced by the
+Licensee.
+
+12. Termination of the Licence
+==============================
+
+The Licence and the rights granted hereunder will terminate
+automatically upon any breach by the Licensee of the terms of the
+Licence.
+
+Such a termination will not terminate the licences of any person who
+has received the Work from the Licensee under the Licence, provided
+such persons remain in full compliance with the Licence.
+
+13. Miscellaneous
+=================
+
+Without prejudice of Article 9 above, the Licence represents the
+complete agreement between the Parties as to the Work.
+
+If any provision of the Licence is invalid or unenforceable under
+applicable law, this will not affect the validity or enforceability of
+the Licence as a whole. Such provision will be construed or reformed so
+as necessary to make it valid and enforceable.
+
+The European Commission may publish other linguistic versions or new
+versions of this Licence or updated versions of the Appendix, so far
+this is required and reasonable, without reducing the scope of the
+rights granted by the Licence.
+
+New versions of the Licence will be published with a unique
+version number.
+
+All linguistic versions of this Licence, approved by the European
+Commission, have identical value. Parties can take advantage of the
+linguistic version of their choice.
+
+14. Jurisdiction
+================
+
+Without prejudice to specific agreement between parties,
+
+* any litigation resulting from the interpretation of this License,
+ arising between the European Union institutions, bodies, offices or
+ agencies, as a Licensor, and any Licensee, will be subject to the
+ jurisdiction of the Court of Justice of the European Union, as laid
+ down in article 272 of the Treaty on the Functioning of the European
+ Union,
+* any litigation arising between other parties and resulting from the
+ interpretation of this License, will be subject to the exclusive
+ jurisdiction of the competent court where the Licensor resides or
+ conducts its primary business.
+
+15. Applicable Law
+==================
+
+Without prejudice to specific agreement between parties,
+
+* this Licence shall be governed by the law of the European Union Member
+ State where the Licensor has his seat, resides or has his registered
+ office,
+* this licence shall be governed by Belgian law if the Licensor has no
+ seat, residence or registered office inside a European Union Member
+ State.
+
+Appendix
+========
+
+‘Compatible Licences’ according to Article 5 EUPL are:
+
+* GNU General Public License (GPL) v. 2, v. 3
+* GNU Affero General Public License (AGPL) v. 3
+* Open Software License (OSL) v. 2.1, v. 3.0
+* Eclipse Public License (EPL) v. 1.0
+* CeCILL v. 2.0, v. 2.1
+* Mozilla Public Licence (MPL) v. 2
+* GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
+* Creative Commons Attribution-ShareAlike v. 3.0 Unported
+ (CC BY-SA 3.0) for works other than software
+* European Union Public Licence (EUPL) v. 1.1, v. 1.2
+* Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R)
+ or Strong Reciprocity (LiLiQ-R+)
+
+The European Commission may update this Appendix to later versions of
+the above licences without producing a new version of the EUPL, as long
+as they provide the rights granted in Article 2 of this Licence and
+protect the covered Source Code from exclusive appropriation.
+
+All other changes or additions to this Appendix require the production
+of a new EUPL version.
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/MANIFEST.in
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/MANIFEST.in (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/MANIFEST.in (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,4 @@
+include LICENCE.rst
+recursive-include aleksis/apps/*/static *
+recursive-include aleksis/apps/*/templates *
+recursive-include aleksis/apps/*/migrations *
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/README.rst
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/README.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/README.rst (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,29 @@
+AlekSIS (School Information System) — App Dashboard Feeds (Include feeds from external resources as widgets on dashboard)
+==================================================================================================
+
+AlekSIS
+-------
+
+This is an application for use with the `AlekSIS`_ platform.
+
+Features
+--------
+
+The author of this app did not describe it yet.
+
+Licence
+-------
+
+::
+
+ Copyright © 2020 Julian Leucker <leuckerj@gmail.com>
+
+ Licenced under the EUPL, version 1.2 or later
+
+Please see the LICENCE.rst file accompanying this distribution for the
+full licence text or on the `European Union Public Licence`_ website
+https://joinup.ec.europa.eu/collection/eupl/guidelines-users-and-developers
+(including all other official language versions).
+
+.. _AlekSIS: https://edugit.org/AlekSIS/AlekSIS
+.. _European Union Public Licence: https://eupl.eu/
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/__init__.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/__init__.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/__init__.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
@@ -0,0 +1,8 @@
+import pkg_resources
+
+try:
+ __version__ = pkg_resources.get_distribution("AlekSIS-App-DashboardFeeds").version
+except Exception:
+ __version__ = "unknown"
+
+default_app_config = "aleksis.apps.dashboardfeeds.apps.DefaultConfig"
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/apps.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/apps.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/apps.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,6 @@
+from aleksis.core.util.apps import AppConfig
+
+
+class DefaultConfig(AppConfig):
+ name = "aleksis.apps.dashboardfeeds"
+ verbose_name = "AlekSIS — Dashboard Feeds (Include feeds from external resources as widgets on dashboard)"
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/menus.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/menus.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/menus.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,17 @@
+from django.utils.translation import ugettext_lazy as _
+
+MENUS = {
+ "NAV_MENU_CORE": [
+ {
+ "name": _("Dashboard Feeds"),
+ "url": "empty",
+ "root": True,
+ "validators": [
+ "menu_generator.validators.is_authenticated",
+ "aleksis.core.util.core_helpers.has_person",
+ ],
+ "submenu": [
+ ],
+ }
+ ]
+}
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/__init__.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/__init__.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/__init__.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,0 @@
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/empty.html
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/empty.html (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/empty.html (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,8 @@
+{% extends 'core/base.html' %}
+{% load i18n %}
+
+{% block content %}
+ <p class="flow-text">
+ {% blocktrans %}Dashboard Feeds (Include feeds from external resources as widgets on dashboard){% endblocktrans %}
+ </p>
+{% endblock %}
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/urls.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/urls.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/urls.py (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,7 @@
+from django.urls import path
+
+from . import views
+
+urlpatterns = [
+ path("empty", views.empty, name="empty"),
+]
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/views.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/views.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/views.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
@@ -0,0 +1,26 @@
+from django.contrib.auth.decorators import login_required
+from django.http import Http404, HttpRequest, HttpResponse
+from django.shortcuts import render
+from django.template.loader import render_to_string
+
+from .models import DashboardWidget
+
+
+@login_required
+def empty(request: HttpRequest) -> HttpResponse:
+ context = {}
+
+ return render(request, "dashboardfeeds/empty.html", context)
+
+
+def get_widgets(request):
+ widgets = DashboardWidget.objects.all()
+
+ widgets_to_return = []
+
+ for widget in widgets:
+ feed = widget.widget.get_feed()
+
+ widgets_to_return.append(render_to_string(widget.widget.template, feed, request))
+
+ return widgets_to_return
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/pyproject.toml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/pyproject.toml (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/pyproject.toml (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
@@ -0,0 +1,28 @@
+[tool.poetry]
+name = "AlekSIS-App-DashboardFeeds"
+version = "1.0"
+packages = [
+ { include = "aleksis" }
+]
+readme = "README.rst"
+
+description = "AlekSIS (School Information System) — App Dashboard Feeds (Include feeds from external resources as widgets on dashboard)"
+authors = ["Julian Leucker <leuckerj@gmail.com>"]
+license = "EUPL-1.2"
+homepage = "https://aleksis.edugit.io/"
+repository = "https://edugit.org/Teckids/AlekSIS/AlekSIS-App-DashboardFeeds"
+documentation = "https://aleksis.edugit.io/AlekSIS/docs/html/"
+classifiers = [
+ "Environment :: Web Environment",
+ "Intended Audience :: Education",
+ "Topic :: Education"
+]
+
+[tool.poetry.dependencies]
+python = "^3.7"
+AlekSIS = { path = "../../.." }
+feedparser = "^5.2.1"
+
+[build-system]
+requires = ["poetry>=1.0"]
+build-backend = "poetry.masonry.api"
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/renovate.json
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/renovate.json (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/renovate.json (revision 4d3235196dca472084aa6fcdccc21ae218ac3a07)
@@ -0,0 +1,1 @@
+{}
Index: AlekSIS/aleksis/core/util/network.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/aleksis/core/util/network.py (revision 94e06304177bf52c979b14a6fbbba85b052dcaf2)
+++ AlekSIS/aleksis/core/util/network.py (revision 9648eaaf23a9e45ba5ab180b973d79d8f2141efb)
@@ -5,8 +5,8 @@
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 @@
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 @@
: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 @@
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 @@
"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 @@
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
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/admin.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/admin.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/admin.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
@@ -0,0 +1,6 @@
+from django.contrib import admin
+
+from .models import DashboardWidget, RSSFeedWidget
+
+admin.site.register(DashboardWidget)
+admin.site.register(RSSFeedWidget)
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0001_initial.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0001_initial.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0001_initial.py (revision f994fda2bf88bc49cd4658a3915ac8626c678c7c)
@@ -0,0 +1,39 @@
+# Generated by Django 3.0.2 on 2020-01-13 14:35
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ initial = True
+
+ dependencies = [
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='DashboardWidget',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('title', models.CharField(max_length=150, verbose_name='Widget Title')),
+ ('active', models.BooleanField(blank=True, verbose_name='Activate Widget')),
+ ],
+ options={
+ 'verbose_name': 'Dashboard Widget',
+ 'verbose_name_plural': 'Dashboard Widgets',
+ },
+ ),
+ migrations.CreateModel(
+ name='RSSFeedWidget',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('url', models.URLField(verbose_name='RSS Url')),
+ ('widget', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='widget', to='dashboardfeeds.DashboardWidget', verbose_name='widget')),
+ ],
+ options={
+ 'verbose_name': 'RSS Widget',
+ 'verbose_name_plural': 'RSS Widgets',
+ },
+ ),
+ ]
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/models.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/models.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/models.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
@@ -0,0 +1,74 @@
+from typing import Optional
+
+from django.contrib.auth import get_user_model
+from django.contrib.auth.models import User
+from django.db import models
+from django.utils import timezone
+from django.utils.translation import ugettext_lazy as _
+import feedparser
+
+from constance import config
+
+from aleksis.core.util import network
+
+
+class DashboardWidget(models.Model):
+ title = models.CharField(max_length=150, verbose_name=_("Widget Title"))
+ active = models.BooleanField(blank=True, verbose_name=_("Activate Widget"))
+ base_url = models.URLField(verbose_name=_("Base URL"),
+ help_text=_("index url of the news website (as link for users)"))
+
+ def __str__(self):
+ return self.title
+
+ class Meta:
+ verbose_name = _("Dashboard Widget")
+ verbose_name_plural = _("Dashboard Widgets")
+
+
+# class WordpressFeedWidget(models.Model):
+# widget = models.OneToOneField(DashboardWidget, related_name="widget", verbose_name=_("widget"),
+# on_delete=models.CASCADE)
+# url = models.URLField(verbose_name=_("Wordpress Url"))
+# filter_vs_composer = models.BooleanField(verbose_name=_("Filter out Visual Composer Tags?"), blank=True, default=True)
+#
+# # author_whitelist: list = None,
+# # author_blacklist: list = None,
+# # category_whitelist: list = None,
+# # category_blacklist: list = None,
+#
+# # https://wordpress.org/support/article/wordpress-feeds/#finding-your-feed-url
+#
+# def get_feed(self):
+# feed = {
+# "title": self.widget.title,
+# "active": self.widget.active,
+# "url": self.url,
+# "results": network.get_newest_articles(domain=self.url, ),
+# }
+#
+# class Meta:
+# verbose_name = _("Wordpress Widget")
+# verbose_name_plural = _("Wordpress Widgets")
+
+
+class RSSFeedWidget(models.Model):
+ template = "dashboardfeeds/rss.html"
+
+ widget = models.OneToOneField(DashboardWidget, related_name="widget", verbose_name=_("widget"),
+ on_delete=models.CASCADE)
+ url = models.URLField(verbose_name=_("RSS Url"))
+
+ def get_feed(self):
+ feed = {
+ "title": self.widget.title,
+ "active": self.widget.active,
+ "url": self.url,
+ "base_url": self.widget.base_url,
+ "result": feedparser.parse(self.url)["entries"][0],
+ }
+ return feed
+
+ class Meta:
+ verbose_name = _("RSS Widget")
+ verbose_name_plural = _("RSS Widgets")
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/poetry.lock
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/poetry.lock (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/poetry.lock (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
@@ -0,0 +1,1271 @@
+[[package]]
+category = "main"
+description = ""
+develop = true
+name = "aleksis"
+optional = false
+python-versions = "^3.7"
+version = "1.0a4.dev0"
+
+[package.dependencies]
+Django = "^3.0"
+Pillow = "^7.0"
+colour = "^0.1.5"
+django-any-js = "^1.0"
+django-bootstrap4 = "^1.0"
+django-ckeditor = "^5.8.0"
+django-debug-toolbar = "^2.0"
+django-easy-audit = "^1.2rc1"
+django-filter = "^2.2.0"
+django-hattori = "^0.2"
+django-image-cropping = "^1.2"
+django-impersonate = "^1.4"
+django-ipware = "^2.1"
+django-maintenance-mode = "^0.14.0"
+django-material = "^1.6.0"
+django-menu-generator = "^1.0.4"
+django-middleware-global-request = "^0.1.2"
+django-pwa = "^1.0.6"
+django-sass-processor = "^0.8"
+django-settings-context-processor = "^0.2"
+django-tables2 = "^2.1"
+django-templated-email = "^2.3.0"
+django-yarnpkg = "^6.0"
+django_select2 = "^7.1"
+django_widget_tweaks = "^1.4.5"
+easy-thumbnails = "^2.6"
+html2text = "^2019.9.26"
+libsass = "^0.19.2"
+psycopg2 = "^2.8"
+python-memcached = "^1.59"
+requests = "^2.22"
+
+[package.dependencies.django-constance]
+extras = ["database"]
+version = "rev 590fa02eb30e377da0eda5cc3a84254b839176a7"
+
+[package.dependencies.django-phonenumber-field]
+extras = ["phonenumbers"]
+version = ">=3.0, <5.0"
+
+[package.dependencies.django-two-factor-auth]
+extras = ["YubiKey", "phonenumbers", "Call", "SMS"]
+version = "^1.10.0"
+
+[package.dependencies.dynaconf]
+extras = ["yaml", "toml", "ini"]
+version = "^2.0"
+
+[package.extras]
+ldap = ["django-auth-ldap (^2.0)"]
+
+[package.source]
+reference = ""
+type = "directory"
+url = "../../.."
+
+[[package]]
+category = "main"
+description = "ASGI specs, helper code, and adapters"
+name = "asgiref"
+optional = false
+python-versions = "*"
+version = "3.2.3"
+
+[package.extras]
+tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"]
+
+[[package]]
+category = "main"
+description = "Internationalization utilities"
+name = "babel"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.8.0"
+
+[package.dependencies]
+pytz = ">=2015.7"
+
+[[package]]
+category = "main"
+description = "Screen-scraping library"
+name = "beautifulsoup4"
+optional = false
+python-versions = "*"
+version = "4.8.2"
+
+[package.dependencies]
+soupsieve = ">=1.2"
+
+[package.extras]
+html5lib = ["html5lib"]
+lxml = ["lxml"]
+
+[[package]]
+category = "main"
+description = "Python package for providing Mozilla's CA Bundle."
+name = "certifi"
+optional = false
+python-versions = "*"
+version = "2019.11.28"
+
+[[package]]
+category = "main"
+description = "Universal encoding detector for Python 2 and 3"
+name = "chardet"
+optional = false
+python-versions = "*"
+version = "3.0.4"
+
+[[package]]
+category = "main"
+description = "Composable command line interface toolkit"
+name = "click"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "7.0"
+
+[[package]]
+category = "main"
+description = "Cross-platform colored terminal text."
+marker = "platform_system == \"Windows\""
+name = "colorama"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "0.4.3"
+
+[[package]]
+category = "main"
+description = "converts and manipulates various color representation (HSL, RVB, web, X11, ...)"
+name = "colour"
+optional = false
+python-versions = "*"
+version = "0.1.5"
+
+[package.extras]
+test = ["nose"]
+
+[[package]]
+category = "main"
+description = "Config file reading, writing and validation."
+name = "configobj"
+optional = false
+python-versions = "*"
+version = "5.0.6"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+category = "main"
+description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design."
+name = "django"
+optional = false
+python-versions = ">=3.6"
+version = "3.0.2"
+
+[package.dependencies]
+asgiref = ">=3.2,<4.0"
+pytz = "*"
+sqlparse = ">=0.2.2"
+
+[package.extras]
+argon2 = ["argon2-cffi (>=16.1.0)"]
+bcrypt = ["bcrypt"]
+
+[[package]]
+category = "main"
+description = "Include JavaScript libraries with readable template tags"
+name = "django-any-js"
+optional = false
+python-versions = "*"
+version = "1.0.3.post0"
+
+[package.dependencies]
+Django = ">=1.11"
+
+[[package]]
+category = "main"
+description = "A helper class for handling configuration defaults of packaged apps gracefully."
+name = "django-appconf"
+optional = false
+python-versions = "*"
+version = "1.0.3"
+
+[package.dependencies]
+django = "*"
+six = "*"
+
+[[package]]
+category = "main"
+description = "Bootstrap support for Django projects"
+name = "django-bootstrap4"
+optional = false
+python-versions = "*"
+version = "1.1.1"
+
+[package.dependencies]
+beautifulsoup4 = "*"
+
+[[package]]
+category = "main"
+description = "Bulk update using one query over Django ORM."
+name = "django-bulk-update"
+optional = false
+python-versions = "*"
+version = "2.2.0"
+
+[package.dependencies]
+Django = ">=1.8"
+
+[[package]]
+category = "main"
+description = "Django admin CKEditor integration."
+name = "django-ckeditor"
+optional = false
+python-versions = "*"
+version = "5.8.0"
+
+[package.dependencies]
+django-js-asset = ">=1.2.2"
+
+[[package]]
+category = "main"
+description = "Django live settings with pluggable backends, including Redis."
+name = "django-constance"
+optional = false
+python-versions = "*"
+version = "2.5.0"
+
+[package.dependencies]
+[package.dependencies.django-picklefield]
+optional = true
+version = "*"
+
+[package.extras]
+database = ["django-picklefield"]
+redis = ["redis"]
+
+[package.source]
+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."
+name = "django-debug-toolbar"
+optional = false
+python-versions = ">=3.5"
+version = "2.1"
+
+[package.dependencies]
+Django = ">=1.11"
+sqlparse = ">=0.2.0"
+
+[[package]]
+category = "main"
+description = "Yet another Django audit log app, hopefully the simplest one."
+name = "django-easy-audit"
+optional = false
+python-versions = "*"
+version = "1.2rc1"
+
+[package.dependencies]
+beautifulsoup4 = "*"
+
+[[package]]
+category = "main"
+description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically."
+name = "django-filter"
+optional = false
+python-versions = ">=3.4"
+version = "2.2.0"
+
+[package.dependencies]
+Django = ">=1.11"
+
+[[package]]
+category = "main"
+description = "A set of high-level abstractions for Django forms"
+name = "django-formtools"
+optional = false
+python-versions = "*"
+version = "2.2"
+
+[package.dependencies]
+Django = ">=1.11"
+
+[[package]]
+category = "main"
+description = "Command to anonymize sensitive data."
+name = "django-hattori"
+optional = false
+python-versions = "*"
+version = "0.2.1"
+
+[package.dependencies]
+Django = ">=1.8"
+Faker = ">=0.8.13"
+django-bulk-update = ">=2.2.0"
+six = "*"
+tqdm = ">=4.23.4"
+
+[[package]]
+category = "main"
+description = "A reusable app for cropping images easily and non-destructively in Django"
+name = "django-image-cropping"
+optional = false
+python-versions = "*"
+version = "1.3.0"
+
+[package.dependencies]
+django-appconf = ">=1.0.2"
+
+[[package]]
+category = "main"
+description = "Django app to allow superusers to impersonate other users."
+name = "django-impersonate"
+optional = false
+python-versions = "*"
+version = "1.4.1"
+
+[[package]]
+category = "main"
+description = "A Django utility application that returns client's real IP address"
+name = "django-ipware"
+optional = false
+python-versions = "*"
+version = "2.1.0"
+
+[[package]]
+category = "main"
+description = "script tag with additional attributes for django.forms.Media"
+name = "django-js-asset"
+optional = false
+python-versions = "*"
+version = "1.2.2"
+
+[[package]]
+category = "main"
+description = "django-maintenance-mode shows a 503 error page when maintenance-mode is on."
+name = "django-maintenance-mode"
+optional = false
+python-versions = "*"
+version = "0.14.0"
+
+[[package]]
+category = "main"
+description = "Material design for django forms and admin"
+name = "django-material"
+optional = false
+python-versions = "*"
+version = "1.6.0"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+category = "main"
+description = "A straightforward menu generator for Django"
+name = "django-menu-generator"
+optional = false
+python-versions = "*"
+version = "1.0.4"
+
+[[package]]
+category = "main"
+description = "Django middleware that keep request instance for every thread."
+name = "django-middleware-global-request"
+optional = false
+python-versions = "*"
+version = "0.1.2"
+
+[package.dependencies]
+django = "*"
+
+[[package]]
+category = "main"
+description = "A pluggable framework for adding two-factor authentication to Django using one-time passwords."
+name = "django-otp"
+optional = false
+python-versions = "*"
+version = "0.7.5"
+
+[package.dependencies]
+django = ">=1.11"
+six = ">=1.10.0"
+
+[package.extras]
+qrcode = ["qrcode"]
+
+[[package]]
+category = "main"
+description = "A django-otp plugin that verifies YubiKey OTP tokens."
+name = "django-otp-yubikey"
+optional = false
+python-versions = "*"
+version = "0.5.2"
+
+[package.dependencies]
+YubiOTP = ">=0.2.2"
+django-otp = ">=0.5.0"
+six = ">=1.10.0"
+
+[[package]]
+category = "main"
+description = "An international phone number field for django models."
+name = "django-phonenumber-field"
+optional = false
+python-versions = ">=3.5"
+version = "3.0.1"
+
+[package.dependencies]
+Django = ">=1.11.3"
+babel = "*"
+
+[package.extras]
+phonenumbers = ["phonenumbers (>=7.0.2)"]
+phonenumberslite = ["phonenumberslite (>=7.0.2)"]
+
+[[package]]
+category = "main"
+description = "Pickled object field for Django"
+name = "django-picklefield"
+optional = false
+python-versions = "*"
+version = "2.0"
+
+[package.dependencies]
+Django = ">=1.11"
+
+[package.extras]
+tests = ["tox"]
+
+[[package]]
+category = "main"
+description = "A Django app to include a manifest.json and Service Worker instance to enable progressive web app behavior"
+name = "django-pwa"
+optional = false
+python-versions = "*"
+version = "1.0.6"
+
+[package.dependencies]
+django = ">=1.8"
+
+[[package]]
+category = "main"
+description = "Render a particular block from a template to a string."
+name = "django-render-block"
+optional = false
+python-versions = "*"
+version = "0.6"
+
+[package.dependencies]
+django = ">=1.11"
+
+[[package]]
+category = "main"
+description = "SASS processor to compile SCSS files into *.css, while rendering, or offline."
+name = "django-sass-processor"
+optional = false
+python-versions = "*"
+version = "0.8"
+
+[package.extras]
+dev = ["libsass (>=0.13)"]
+management-command = ["django-compressor (>=2.4)"]
+
+[[package]]
+category = "main"
+description = "Select2 option fields for Django"
+name = "django-select2"
+optional = false
+python-versions = "*"
+version = "7.2.0"
+
+[package.dependencies]
+django = ">=2.2"
+django-appconf = ">=0.6.0"
+
+[[package]]
+category = "main"
+description = "Makes specified django settings visible in template rendering context."
+name = "django-settings-context-processor"
+optional = false
+python-versions = "*"
+version = "0.2"
+
+[[package]]
+category = "main"
+description = "Table/data-grid framework for Django"
+name = "django-tables2"
+optional = false
+python-versions = "*"
+version = "2.2.1"
+
+[package.dependencies]
+Django = ">=1.11"
+
+[package.extras]
+tablib = ["tablib"]
+
+[[package]]
+category = "main"
+description = "A Django oriented templated / transaction email abstraction"
+name = "django-templated-email"
+optional = false
+python-versions = "*"
+version = "2.3.0"
+
+[package.dependencies]
+django-render-block = ">=0.5"
+six = ">=1"
+
+[[package]]
+category = "main"
+description = "Complete Two-Factor Authentication for Django"
+name = "django-two-factor-auth"
+optional = false
+python-versions = "*"
+version = "1.10.0"
+
+[package.dependencies]
+Django = ">=1.11"
+django-formtools = "*"
+django-otp = ">=0.6.0,<0.99"
+django-phonenumber-field = ">=1.1.0,<3.99"
+qrcode = ">=4.0.0,<6.99"
+
+[package.dependencies.django-otp-yubikey]
+optional = true
+version = "*"
+
+[package.dependencies.phonenumbers]
+optional = true
+version = ">=7.0.9,<8.99"
+
+[package.dependencies.twilio]
+optional = true
+version = ">=6.0"
+
+[package.extras]
+Call = ["twilio (>=6.0)"]
+SMS = ["twilio (>=6.0)"]
+YubiKey = ["django-otp-yubikey"]
+phonenumbers = ["phonenumbers (>=7.0.9,<8.99)"]
+phonenumberslite = ["phonenumberslite (>=7.0.9,<8.99)"]
+
+[[package]]
+category = "main"
+description = "Tweak the form field rendering in templates, not in python-level form definitions."
+name = "django-widget-tweaks"
+optional = false
+python-versions = "*"
+version = "1.4.5"
+
+[[package]]
+category = "main"
+description = "Integrate django with yarnpkg"
+name = "django-yarnpkg"
+optional = false
+python-versions = "*"
+version = "6.0.1"
+
+[package.dependencies]
+django = "*"
+six = "*"
+
+[[package]]
+category = "main"
+description = "The dynamic configurator for your Python Project"
+name = "dynaconf"
+optional = false
+python-versions = "*"
+version = "2.2.2"
+
+[package.dependencies]
+click = "<=7.0"
+python-box = "<4.0.0"
+python-dotenv = "<=0.10.3"
+
+[[package.dependencies.toml]]
+version = "<=0.10.0"
+
+[[package.dependencies.toml]]
+optional = true
+version = "*"
+
+[package.dependencies.PyYAML]
+optional = true
+version = "*"
+
+[package.dependencies.configobj]
+optional = true
+version = "*"
+
+[package.extras]
+all = ["redis", "pyyaml", "configobj", "hvac"]
+configobj = ["configobj"]
+ini = ["configobj"]
+redis = ["redis"]
+toml = ["toml"]
+vault = ["hvac"]
+yaml = ["pyyaml"]
+
+[[package]]
+category = "main"
+description = "Easy thumbnails for Django"
+name = "easy-thumbnails"
+optional = false
+python-versions = ">=3.5"
+version = "2.7"
+
+[package.dependencies]
+django = ">=1.11,<4.0"
+pillow = "*"
+
+[[package]]
+category = "main"
+description = "Faker is a Python package that generates fake data for you."
+name = "faker"
+optional = false
+python-versions = ">=3.4"
+version = "4.0.0"
+
+[package.dependencies]
+python-dateutil = ">=2.4"
+text-unidecode = "1.3"
+
+[[package]]
+category = "main"
+description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds"
+name = "feedparser"
+optional = false
+python-versions = "*"
+version = "5.2.1"
+
+[[package]]
+category = "main"
+description = "Turn HTML into equivalent Markdown-structured text."
+name = "html2text"
+optional = false
+python-versions = ">=3.5"
+version = "2019.9.26"
+
+[[package]]
+category = "main"
+description = "Internationalized Domain Names in Applications (IDNA)"
+name = "idna"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "2.8"
+
+[[package]]
+category = "main"
+description = "Sass for Python: A straightforward binding of libsass for Python."
+name = "libsass"
+optional = false
+python-versions = "*"
+version = "0.19.4"
+
+[package.dependencies]
+six = "*"
+
+[[package]]
+category = "main"
+description = "Python version of Google's common library for parsing, formatting, storing and validating international phone numbers."
+name = "phonenumbers"
+optional = false
+python-versions = "*"
+version = "8.11.1"
+
+[[package]]
+category = "main"
+description = "Python Imaging Library (Fork)"
+name = "pillow"
+optional = false
+python-versions = ">=3.5"
+version = "7.0.0"
+
+[[package]]
+category = "main"
+description = "psycopg2 - Python-PostgreSQL Database Adapter"
+name = "psycopg2"
+optional = false
+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*"
+version = "2.8.4"
+
+[[package]]
+category = "main"
+description = "Cryptographic library for Python"
+name = "pycryptodome"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "3.9.4"
+
+[[package]]
+category = "main"
+description = "JSON Web Token implementation in Python"
+name = "pyjwt"
+optional = false
+python-versions = "*"
+version = "1.7.1"
+
+[package.extras]
+crypto = ["cryptography (>=1.4)"]
+flake8 = ["flake8", "flake8-import-order", "pep8-naming"]
+test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"]
+
+[[package]]
+category = "main"
+description = "Advanced Python dictionaries with dot notation access"
+name = "python-box"
+optional = false
+python-versions = "*"
+version = "3.4.6"
+
+[package.extras]
+testing = ["pytest", "coverage (>=3.6)", "pytest-cov"]
+
+[[package]]
+category = "main"
+description = "Extensions to the standard Python datetime module"
+name = "python-dateutil"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+version = "2.8.1"
+
+[package.dependencies]
+six = ">=1.5"
+
+[[package]]
+category = "main"
+description = "Add .env support to your django/flask apps in development and deployments"
+name = "python-dotenv"
+optional = false
+python-versions = "*"
+version = "0.10.3"
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
+[[package]]
+category = "main"
+description = "Pure python memcached client"
+name = "python-memcached"
+optional = false
+python-versions = "*"
+version = "1.59"
+
+[package.dependencies]
+six = ">=1.4.0"
+
+[[package]]
+category = "main"
+description = "World timezone definitions, modern and historical"
+name = "pytz"
+optional = false
+python-versions = "*"
+version = "2019.3"
+
+[[package]]
+category = "main"
+description = "YAML parser and emitter for Python"
+name = "pyyaml"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "5.3"
+
+[[package]]
+category = "main"
+description = "QR Code image generator"
+name = "qrcode"
+optional = false
+python-versions = "*"
+version = "6.1"
+
+[package.dependencies]
+colorama = "*"
+six = "*"
+
+[package.extras]
+dev = ["tox", "pytest", "mock"]
+maintainer = ["zest.releaser"]
+pil = ["pillow"]
+test = ["pytest", "pytest-cov", "mock"]
+
+[[package]]
+category = "main"
+description = "Python HTTP for Humans."
+name = "requests"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+version = "2.22.0"
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+chardet = ">=3.0.2,<3.1.0"
+idna = ">=2.5,<2.9"
+urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26"
+
+[package.extras]
+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"]
+
+[[package]]
+category = "main"
+description = "Python 2 and 3 compatibility utilities"
+name = "six"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*"
+version = "1.13.0"
+
+[[package]]
+category = "main"
+description = "A modern CSS selector implementation for Beautiful Soup."
+name = "soupsieve"
+optional = false
+python-versions = "*"
+version = "1.9.5"
+
+[[package]]
+category = "main"
+description = "Non-validating SQL parser"
+name = "sqlparse"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+version = "0.3.0"
+
+[[package]]
+category = "main"
+description = "The most basic Text::Unidecode port"
+name = "text-unidecode"
+optional = false
+python-versions = "*"
+version = "1.3"
+
+[[package]]
+category = "main"
+description = "Python Library for Tom's Obvious, Minimal Language"
+name = "toml"
+optional = false
+python-versions = "*"
+version = "0.10.0"
+
+[[package]]
+category = "main"
+description = "Fast, Extensible Progress Meter"
+name = "tqdm"
+optional = false
+python-versions = ">=2.6, !=3.0.*, !=3.1.*"
+version = "4.41.1"
+
+[package.extras]
+dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"]
+
+[[package]]
+category = "main"
+description = "Twilio API client and TwiML generator"
+name = "twilio"
+optional = false
+python-versions = "*"
+version = "6.35.2"
+
+[package.dependencies]
+PyJWT = ">=1.4.2"
+pytz = "*"
+six = "*"
+
+[package.dependencies.requests]
+python = ">=3.0"
+version = ">=2.0.0"
+
+[[package]]
+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"
+
+[package.extras]
+brotli = ["brotlipy (>=0.6.0)"]
+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"]
+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"]
+
+[[package]]
+category = "main"
+description = "A library for verifying YubiKey OTP tokens, both locally and through a Yubico web service."
+name = "yubiotp"
+optional = false
+python-versions = "*"
+version = "0.2.2.post1"
+
+[package.dependencies]
+pycryptodome = "*"
+six = "*"
+
+[metadata]
+content-hash = "2b1e8c5d8a499199e0ea131bc709f41131b4db1eaaa66d818d4024d8d9bc72c3"
+python-versions = "^3.7"
+
+[metadata.files]
+aleksis = []
+asgiref = [
+ {file = "asgiref-3.2.3-py2.py3-none-any.whl", hash = "sha256:ea448f92fc35a0ef4b1508f53a04c4670255a3f33d22a81c8fc9c872036adbe5"},
+ {file = "asgiref-3.2.3.tar.gz", hash = "sha256:7e06d934a7718bf3975acbf87780ba678957b87c7adc056f13b6215d610695a0"},
+]
+babel = [
+ {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"},
+ {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"},
+]
+beautifulsoup4 = [
+ {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"},
+ {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"},
+ {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"},
+]
+certifi = [
+ {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"},
+ {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"},
+]
+chardet = [
+ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"},
+ {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"},
+]
+click = [
+ {file = "Click-7.0-py2.py3-none-any.whl", hash = "sha256:2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13"},
+ {file = "Click-7.0.tar.gz", hash = "sha256:5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"},
+]
+colorama = [
+ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"},
+ {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"},
+]
+colour = [
+ {file = "colour-0.1.5-py2.py3-none-any.whl", hash = "sha256:33f6db9d564fadc16e59921a56999b79571160ce09916303d35346dddc17978c"},
+ {file = "colour-0.1.5.tar.gz", hash = "sha256:af20120fefd2afede8b001fbef2ea9da70ad7d49fafdb6489025dae8745c3aee"},
+]
+configobj = [
+ {file = "configobj-5.0.6.tar.gz", hash = "sha256:a2f5650770e1c87fb335af19a9b7eb73fc05ccf22144eb68db7d00cd2bcb0902"},
+]
+django = [
+ {file = "Django-3.0.2-py3-none-any.whl", hash = "sha256:4f2c913303be4f874015993420bf0bd8fd2097a9c88e6b49c6a92f9bdd3fb13a"},
+ {file = "Django-3.0.2.tar.gz", hash = "sha256:8c3575f81e11390893860d97e1e0154c47512f180ea55bd84ce8fa69ba8051ca"},
+]
+django-any-js = [
+ {file = "django-any-js-1.0.3.post0.tar.gz", hash = "sha256:1da88b44b861b0f54f6b8ea0eb4c7c4fa1a5772e9a4320532cd4e0871a4e23f7"},
+]
+django-appconf = [
+ {file = "django-appconf-1.0.3.tar.gz", hash = "sha256:35f13ca4d567f132b960e2cd4c832c2d03cb6543452d34e29b7ba10371ba80e3"},
+ {file = "django_appconf-1.0.3-py2.py3-none-any.whl", hash = "sha256:c98a7af40062e996b921f5962a1c4f3f0c979fa7885f7be4710cceb90ebe13a6"},
+]
+django-bootstrap4 = [
+ {file = "django-bootstrap4-1.1.1.tar.gz", hash = "sha256:39f97cbce85eb66f6d76be2029bae171bd3863d0c6932b1c2dae7f299c569b90"},
+ {file = "django_bootstrap4-1.1.1-py3-none-any.whl", hash = "sha256:0fcd84f8414a58b43df0b331c00c8b2f1786ae28f75f419b4d33b06fca43e0d1"},
+]
+django-bulk-update = [
+ {file = "django-bulk-update-2.2.0.tar.gz", hash = "sha256:5ab7ce8a65eac26d19143cc189c0f041d5c03b9d1b290ca240dc4f3d6aaeb337"},
+ {file = "django_bulk_update-2.2.0-py2.py3-none-any.whl", hash = "sha256:49a403392ae05ea872494d74fb3dfa3515f8df5c07cc277c3dc94724c0ee6985"},
+]
+django-ckeditor = [
+ {file = "django-ckeditor-5.8.0.tar.gz", hash = "sha256:46fc9c7346ea36183dc0cea350f98704f8b04c4722b7fe4fb18baf8ae20423fb"},
+ {file = "django_ckeditor-5.8.0-py2.py3-none-any.whl", hash = "sha256:a59bab13f4481318f8a048b1b0aef5c7da768a6352dcfb9ba0e77d91fbb9462a"},
+]
+django-constance = []
+django-debug-toolbar = [
+ {file = "django-debug-toolbar-2.1.tar.gz", hash = "sha256:24c157bc6c0e1648e0a6587511ecb1b007a00a354ce716950bff2de12693e7a8"},
+ {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"},
+]
+django-filter = [
+ {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"},
+ {file = "django_filter-2.2.0-py3-none-any.whl", hash = "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b"},
+]
+django-formtools = [
+ {file = "django-formtools-2.2.tar.gz", hash = "sha256:c5272c03c1cd51b2375abf7397a199a3148a9fbbf2f100e186467a84025d13b2"},
+ {file = "django_formtools-2.2-py2.py3-none-any.whl", hash = "sha256:304fa777b8ef9e0693ce7833f885cb89ba46b0e46fc23b01176900a93f46742f"},
+]
+django-hattori = [
+ {file = "django-hattori-0.2.1.tar.gz", hash = "sha256:6953d40881317252f19f62c4e7fe8058924b852c7498bc42beb7bc4d268c252c"},
+ {file = "django_hattori-0.2.1-py2.py3-none-any.whl", hash = "sha256:e529ed7af8fc34a0169c797c477672b687a205a56f3f5206f90c260acb83b7ac"},
+]
+django-image-cropping = [
+ {file = "django-image-cropping-1.3.0.tar.gz", hash = "sha256:5c102d87bc66de025517ad06e485c100f73313ebf725e7482a728944276f6463"},
+]
+django-impersonate = [
+ {file = "django-impersonate-1.4.1.tar.gz", hash = "sha256:63b62d06f93b0318698c68f7314c78473914c262d4164eb66ad860bb83e04771"},
+]
+django-ipware = [
+ {file = "django-ipware-2.1.0.tar.gz", hash = "sha256:a7c7a8fd019dbdc9c357e6e582f65034e897572fc79a7e467674efa8aef9d00b"},
+]
+django-js-asset = [
+ {file = "django-js-asset-1.2.2.tar.gz", hash = "sha256:c163ae80d2e0b22d8fb598047cd0dcef31f81830e127cfecae278ad574167260"},
+ {file = "django_js_asset-1.2.2-py2.py3-none-any.whl", hash = "sha256:8ec12017f26eec524cab436c64ae73033368a372970af4cf42d9354fcb166bdd"},
+]
+django-maintenance-mode = [
+ {file = "django-maintenance-mode-0.14.0.tar.gz", hash = "sha256:f3fef1760fdcda5e0bf6c2966aadc77eea6f328580a9c751920daba927281a68"},
+ {file = "django_maintenance_mode-0.14.0-py2-none-any.whl", hash = "sha256:b4cc24a469ed10897826a28f05d64e6166a58d130e4940ac124ce198cd4cc778"},
+]
+django-material = [
+ {file = "django-material-1.6.0.tar.gz", hash = "sha256:767ab6ad51f906bf773f927e853c2bff6b4ebdd1bd2bf45dbd4ef3e31657c3d5"},
+ {file = "django_material-1.6.0-py2.py3-none-any.whl", hash = "sha256:6a30e42f0ceefef1ff325bda0017fa6f6a7fa534b15b8fcc48eb96de4b6adc8e"},
+]
+django-menu-generator = [
+ {file = "django-menu-generator-1.0.4.tar.gz", hash = "sha256:ce71a5055c16933c8aff64fb36c21e5cf8b6d505733aceed1252f8b99369a378"},
+]
+django-middleware-global-request = [
+ {file = "django-middleware-global-request-0.1.2.tar.gz", hash = "sha256:f6490759bc9f7dbde4001709554e29ca715daf847f2222914b4e47117dca9313"},
+]
+django-otp = [
+ {file = "django-otp-0.7.5.tar.gz", hash = "sha256:1f16c2b93fe484706ff16ac6f5e64ecc73dd240318c333e0560384ba548d3837"},
+ {file = "django_otp-0.7.5-py2.py3-none-any.whl", hash = "sha256:cd4975539be478417033561e9832a1a69a583189f680e92a649f412c661f90aa"},
+]
+django-otp-yubikey = [
+ {file = "django-otp-yubikey-0.5.2.tar.gz", hash = "sha256:f0b1881562fb42ee9f12c28d284cbdb90d1f0383f2d53a595373b080a19bc261"},
+ {file = "django_otp_yubikey-0.5.2-py2.py3-none-any.whl", hash = "sha256:26b12c763b37e99b95b8b8a54d06d8d54c3774eb26133a452f54558033de732b"},
+]
+django-phonenumber-field = [
+ {file = "django-phonenumber-field-3.0.1.tar.gz", hash = "sha256:794ebbc3068a7af75aa72a80cb0cec67e714ff8409a965968040f1fd210b2d97"},
+ {file = "django_phonenumber_field-3.0.1-py3-none-any.whl", hash = "sha256:1ab19f723928582fed412bd9844221fa4ff466276d8526b8b4a9913ee1487c5e"},
+]
+django-picklefield = [
+ {file = "django-picklefield-2.0.tar.gz", hash = "sha256:f1733a8db1b6046c0d7d738e785f9875aa3c198215de11993463a9339aa4ea24"},
+ {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"},
+]
+django-render-block = [
+ {file = "django_render_block-0.6-py2.py3-none-any.whl", hash = "sha256:95c7dc9610378a10e0c4a10d8364ec7307210889afccd6a67a6aaa0fd599bd4d"},
+]
+django-sass-processor = [
+ {file = "django-sass-processor-0.8.tar.gz", hash = "sha256:e039551994feaaba6fcf880412b25a772dd313162a34cbb4289814988cfae340"},
+]
+django-select2 = [
+ {file = "django-select2-7.2.0.tar.gz", hash = "sha256:4c531cb7e9eb4152c7e5f8ab83be386f46978b3d80e91e55ad1fb46382222a0b"},
+ {file = "django_select2-7.2.0-py2.py3-none-any.whl", hash = "sha256:d17bb0e64503a7e52ba405f73a187664906cefda5f1c33971c67ab0b3891e91c"},
+]
+django-settings-context-processor = [
+ {file = "django-settings-context-processor-0.2.tar.gz", hash = "sha256:d37c853d69a3069f5abbf94c7f4f6fc0fac38bbd0524190cd5a250ba800e496a"},
+]
+django-tables2 = [
+ {file = "django-tables2-2.2.1.tar.gz", hash = "sha256:0d9b17f5c030ba1b5fcaeb206d8397bf58f1fdfc6beaf56e7874841b8647aa94"},
+ {file = "django_tables2-2.2.1-py2.py3-none-any.whl", hash = "sha256:6afa0496695e15b332e98537265d09fe01a55b28c75a85323d8e6b0dc2350280"},
+]
+django-templated-email = [
+ {file = "django-templated-email-2.3.0.tar.gz", hash = "sha256:536c4e5ae099eabfb9aab36087d4d7799948c654e73da55a744213d086d5bb33"},
+]
+django-two-factor-auth = [
+ {file = "django-two-factor-auth-1.10.0.tar.gz", hash = "sha256:3c3af3cd747462be18e7494c4068a2bdc606d7a2d2b2914f8d4590fc80995a71"},
+ {file = "django_two_factor_auth-1.10.0-py2.py3-none-any.whl", hash = "sha256:0945260fa84e4522d8fa951c35e401616579fd8564938441614399dc588a1c1f"},
+]
+django-widget-tweaks = [
+ {file = "django-widget-tweaks-1.4.5.tar.gz", hash = "sha256:f2e2c9c9be1ccc59061e248dcc2144f4906d594abe1a563902f4bdf6aa14e432"},
+ {file = "django_widget_tweaks-1.4.5-py2.py3-none-any.whl", hash = "sha256:65c960f3d75008a285e4b10f4d21f9eae4160fd77a0f6097ad545185f8648bd6"},
+]
+django-yarnpkg = [
+ {file = "django-yarnpkg-6.0.1.tar.gz", hash = "sha256:aa059347b246c6f242401581d2c129bdcb45aa726be59fe2f288762a9843348a"},
+]
+dynaconf = [
+ {file = "dynaconf-2.2.2-py2.py3-none-any.whl", hash = "sha256:3cfc1ad7efae08b9cf91d81043a3230175e74e01157d875ce5ec6709bf4e6b9d"},
+ {file = "dynaconf-2.2.2.tar.gz", hash = "sha256:4bac78b432e090d8ed66f1c23fb32e03ca91a590bf0a51ac36137e0e45ac31ca"},
+]
+easy-thumbnails = [
+ {file = "easy-thumbnails-2.7.tar.gz", hash = "sha256:e4e7a0dd4001f56bfd4058428f2c91eafe27d33ef3b8b33ac4e013b159b9ff91"},
+]
+faker = [
+ {file = "Faker-4.0.0-py3-none-any.whl", hash = "sha256:047d4d1791bfb3756264da670d99df13d799bb36e7d88774b1585a82d05dbaec"},
+ {file = "Faker-4.0.0.tar.gz", hash = "sha256:1b1a58961683b30c574520d0c739c4443e0ef6a185c04382e8cc888273dbebed"},
+]
+feedparser = [
+ {file = "feedparser-5.2.1.tar.bz2", hash = "sha256:ce875495c90ebd74b179855449040003a1beb40cd13d5f037a0654251e260b02"},
+ {file = "feedparser-5.2.1.tar.gz", hash = "sha256:bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9"},
+ {file = "feedparser-5.2.1.zip", hash = "sha256:cd2485472e41471632ed3029d44033ee420ad0b57111db95c240c9160a85831c"},
+]
+html2text = [
+ {file = "html2text-2019.9.26-py3-none-any.whl", hash = "sha256:55ce85704f244fc18890c5ded89fa22ff7333e41e9f3cad04d51f48d62ad8834"},
+ {file = "html2text-2019.9.26.tar.gz", hash = "sha256:6f56057c5c2993b5cc5b347cb099bdf6d095828fef1b53ef4e2a2bf2a1be9b4f"},
+]
+idna = [
+ {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"},
+ {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"},
+]
+libsass = [
+ {file = "libsass-0.19.4-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:74acd9adf506142699dfa292f0e569fdccbd9e7cf619e8226f7117de73566e32"},
+ {file = "libsass-0.19.4-cp27-cp27m-win32.whl", hash = "sha256:50778d4be269a021ba2bf42b5b8f6ff3704ab96a82175a052680bddf3ba7cc9f"},
+ {file = "libsass-0.19.4-cp27-cp27m-win_amd64.whl", hash = "sha256:4dcfd561fb100250b89496e1362b96f2cc804f689a59731eb0f94f9a9e144f4a"},
+ {file = "libsass-0.19.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:845a9573b25c141164972d498855f4ad29367c09e6d76fad12955ad0e1c83013"},
+ {file = "libsass-0.19.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:81a013a4c2a614927fd1ef7a386eddabbba695cbb02defe8f31cf495106e974c"},
+ {file = "libsass-0.19.4-cp35-cp35m-win32.whl", hash = "sha256:fcb7ab4dc81889e5fc99cafbc2017bc76996f9992fc6b175f7a80edac61d71df"},
+ {file = "libsass-0.19.4-cp35-cp35m-win_amd64.whl", hash = "sha256:fc5f8336750f76f1bfae82f7e9e89ae71438d26fc4597e3ab4c05ca8fcd41d8a"},
+ {file = "libsass-0.19.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:9b59afa0d755089c4165516400a39a289b796b5612eeef5736ab7a1ebf96a67c"},
+ {file = "libsass-0.19.4-cp36-cp36m-win32.whl", hash = "sha256:c93df526eeef90b1ea4799c1d33b6cd5aea3e9f4633738fb95c1287c13e6b404"},
+ {file = "libsass-0.19.4-cp36-cp36m-win_amd64.whl", hash = "sha256:0fd8b4337b3b101c6e6afda9112cc0dc4bacb9133b59d75d65968c7317aa3272"},
+ {file = "libsass-0.19.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:003a65b4facb4c5dbace53fb0f70f61c5aae056a04b4d112a198c3c9674b31f2"},
+ {file = "libsass-0.19.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:338e9ae066bf1fde874e335324d5355c52d2081d978b4f74fc59536564b35b08"},
+ {file = "libsass-0.19.4-cp37-cp37m-win32.whl", hash = "sha256:e318f06f06847ff49b1f8d086ac9ebce1e63404f7ea329adab92f4f16ba0e00e"},
+ {file = "libsass-0.19.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a7e685466448c9b1bf98243339793978f654a1151eb5c975f09b83c7a226f4c1"},
+ {file = "libsass-0.19.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6a51393d75f6e3c812785b0fa0b7d67c54258c28011921f204643b55f7355ec0"},
+ {file = "libsass-0.19.4.tar.gz", hash = "sha256:8b5b6d1a7c4ea1d954e0982b04474cc076286493f6af2d0a13c2e950fbe0be95"},
+]
+phonenumbers = [
+ {file = "phonenumbers-8.11.1-py2.py3-none-any.whl", hash = "sha256:aaa19bc1f2c7efbf7a94be33558e0c5b71620377c9271692d3e314c558962460"},
+ {file = "phonenumbers-8.11.1.tar.gz", hash = "sha256:239507184ee5b1b83557005af1d5fcce70f83ae18f5dff45b94a67226db10d63"},
+]
+pillow = [
+ {file = "Pillow-7.0.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:5f3546ceb08089cedb9e8ff7e3f6a7042bb5b37c2a95d392fb027c3e53a2da00"},
+ {file = "Pillow-7.0.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9d2ba4ed13af381233e2d810ff3bab84ef9f18430a9b336ab69eaf3cd24299ff"},
+ {file = "Pillow-7.0.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:ff3797f2f16bf9d17d53257612da84dd0758db33935777149b3334c01ff68865"},
+ {file = "Pillow-7.0.0-cp35-cp35m-win32.whl", hash = "sha256:c18f70dc27cc5d236f10e7834236aff60aadc71346a5bc1f4f83a4b3abee6386"},
+ {file = "Pillow-7.0.0-cp35-cp35m-win_amd64.whl", hash = "sha256:875358310ed7abd5320f21dd97351d62de4929b0426cdb1eaa904b64ac36b435"},
+ {file = "Pillow-7.0.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:ab76e5580b0ed647a8d8d2d2daee170e8e9f8aad225ede314f684e297e3643c2"},
+ {file = "Pillow-7.0.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a62ec5e13e227399be73303ff301f2865bf68657d15ea50b038d25fc41097317"},
+ {file = "Pillow-7.0.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8ac6ce7ff3892e5deaab7abaec763538ffd011f74dc1801d93d3c5fc541feee2"},
+ {file = "Pillow-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:91b710e3353aea6fc758cdb7136d9bbdcb26b53cefe43e2cba953ac3ee1d3313"},
+ {file = "Pillow-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bf598d2e37cf8edb1a2f26ed3fb255191f5232badea4003c16301cb94ac5bdd0"},
+ {file = "Pillow-7.0.0-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:5bfef0b1cdde9f33881c913af14e43db69815c7e8df429ceda4c70a5e529210f"},
+ {file = "Pillow-7.0.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:dc058b7833184970d1248135b8b0ab702e6daa833be14035179f2acb78ff5636"},
+ {file = "Pillow-7.0.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c5ed816632204a2fc9486d784d8e0d0ae754347aba99c811458d69fcdfd2a2f9"},
+ {file = "Pillow-7.0.0-cp37-cp37m-win32.whl", hash = "sha256:54ebae163e8412aff0b9df1e88adab65788f5f5b58e625dc5c7f51eaf14a6837"},
+ {file = "Pillow-7.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:87269cc6ce1e3dee11f23fa515e4249ae678dbbe2704598a51cee76c52e19cda"},
+ {file = "Pillow-7.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0a628977ac2e01ca96aaae247ec2bd38e729631ddf2221b4b715446fd45505be"},
+ {file = "Pillow-7.0.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:62a889aeb0a79e50ecf5af272e9e3c164148f4bd9636cc6bcfa182a52c8b0533"},
+ {file = "Pillow-7.0.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bf4003aa538af3f4205c5fac56eacaa67a6dd81e454ffd9e9f055fff9f1bc614"},
+ {file = "Pillow-7.0.0-cp38-cp38-win32.whl", hash = "sha256:7406f5a9b2fd966e79e6abdaf700585a4522e98d6559ce37fc52e5c955fade0a"},
+ {file = "Pillow-7.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:5f7ae9126d16194f114435ebb79cc536b5682002a4fa57fa7bb2cbcde65f2f4d"},
+ {file = "Pillow-7.0.0-pp373-pypy36_pp73-win32.whl", hash = "sha256:8453f914f4e5a3d828281a6628cf517832abfa13ff50679a4848926dac7c0358"},
+ {file = "Pillow-7.0.0.tar.gz", hash = "sha256:4d9ed9a64095e031435af120d3c910148067087541131e82b3e8db302f4c8946"},
+]
+psycopg2 = [
+ {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"},
+ {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"},
+ {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"},
+ {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"},
+ {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"},
+ {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"},
+ {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"},
+ {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"},
+ {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"},
+ {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"},
+ {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"},
+ {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"},
+ {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"},
+]
+pycryptodome = [
+ {file = "pycryptodome-3.9.4-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:6c2720696b10ae356040e888bde1239b8957fe18885ccf5e7b4e8dec882f0856"},
+ {file = "pycryptodome-3.9.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:5c485ed6e9718ebcaa81138fa70ace9c563d202b56a8cee119b4085b023931f5"},
+ {file = "pycryptodome-3.9.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:56fdd0e425f1b8fd3a00b6d96351f86226674974814c50534864d0124d48871f"},
+ {file = "pycryptodome-3.9.4-cp27-cp27m-win32.whl", hash = "sha256:2de33ed0a95855735d5a0fc0c39603314df9e78ee8bbf0baa9692fb46b3b8bbb"},
+ {file = "pycryptodome-3.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:eec0689509389f19875f66ae8dedd59f982240cdab31b9f78a8dc266011df93a"},
+ {file = "pycryptodome-3.9.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68fab8455efcbfe87c5d75015476f9b606227ffe244d57bfd66269451706e899"},
+ {file = "pycryptodome-3.9.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4b9533d4166ca07abdd49ce9d516666b1df944997fe135d4b21ac376aa624aff"},
+ {file = "pycryptodome-3.9.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:d3fe3f33ad52bf0c19ee6344b695ba44ffbfa16f3c29ca61116b48d97bd970fb"},
+ {file = "pycryptodome-3.9.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:319e568baf86620b419d53063b18c216abf924875966efdfe06891b987196a45"},
+ {file = "pycryptodome-3.9.4-cp34-cp34m-win32.whl", hash = "sha256:042ae873baadd0c33b4d699a5c5b976ade3233a979d972f98ca82314632d868c"},
+ {file = "pycryptodome-3.9.4-cp34-cp34m-win_amd64.whl", hash = "sha256:a30f501bbb32e01a49ef9e09ca1260e5ab49bf33a257080ec553e08997acc487"},
+ {file = "pycryptodome-3.9.4-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:b55c60c321ac91945c60a40ac9896ac7a3d432bb3e8c14006dfd82ad5871c331"},
+ {file = "pycryptodome-3.9.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9d9945ac8375d5d8e60bd2a2e1df5882eaa315522eedf3ca868b1546dfa34eba"},
+ {file = "pycryptodome-3.9.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4372ec7518727172e1605c0843cdc5375d4771e447b8148c787b860260aae151"},
+ {file = "pycryptodome-3.9.4-cp35-cp35m-win32.whl", hash = "sha256:0502876279772b1384b660ccc91563d04490d562799d8e2e06b411e2d81128a9"},
+ {file = "pycryptodome-3.9.4-cp35-cp35m-win_amd64.whl", hash = "sha256:72166c2ac520a5dbd2d90208b9c279161ec0861662a621892bd52fb6ca13ab91"},
+ {file = "pycryptodome-3.9.4-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:b4af098f2a50f8d048ab12cabb59456585c0acf43d90ee79782d2d6d0ed59dba"},
+ {file = "pycryptodome-3.9.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:8a799bea3c6617736e914a2e77c409f52893d382f619f088f8a80e2e21f573c1"},
+ {file = "pycryptodome-3.9.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:7c52308ac5b834331b2f107a490b2c27de024a229b61df4cdc5c131d563dfe98"},
+ {file = "pycryptodome-3.9.4-cp36-cp36m-win32.whl", hash = "sha256:63c103a22cbe9752f6ea9f1a0de129995bad91c4d03a66c67cffcf6ee0c9f1e1"},
+ {file = "pycryptodome-3.9.4-cp36-cp36m-win_amd64.whl", hash = "sha256:54456cf85130e01674d21fb1ab89ffccacb138a8ade88d72fa2b0ac898d2798b"},
+ {file = "pycryptodome-3.9.4-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:aec4d42deb836b8fb3ba32f2ba1ef0d33dd3dc9d430b1479ee7a914490d15b5e"},
+ {file = "pycryptodome-3.9.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:896e9b6fd0762aa07b203c993fbbee7a1f1a4674c6886afd7bfa86f3d1be98a8"},
+ {file = "pycryptodome-3.9.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:57b1b707363490c495ad0eeb38bd1b0e1697c497af25fad78d3a1ebf0477fd5b"},
+ {file = "pycryptodome-3.9.4-cp37-cp37m-win32.whl", hash = "sha256:87d8d85b4792ca5e730fb7a519fbc3ed976c59dcf79c5204589c59afd56b9926"},
+ {file = "pycryptodome-3.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:e3a79a30d15d9c7c284a7734036ee8abdb5ca3a6f5774d293cdc9e1358c1dc10"},
+ {file = "pycryptodome-3.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:48821950ffb9c836858d8fa09d7840b6df52eadd387a3c5acece55cb387743f9"},
+ {file = "pycryptodome-3.9.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cbfd97f9e060f0d30245cd29fa267a9a84de9da97559366fca0a3f7655acc63f"},
+ {file = "pycryptodome-3.9.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9ef966c727de942de3e41aa8462c4b7b4bca70f19af5a3f99e31376589c11aac"},
+ {file = "pycryptodome-3.9.4-cp38-cp38-win32.whl", hash = "sha256:a8ca2450394d3699c9f15ef25e8de9a24b401933716a1e39d37fa01f5fe3c58b"},
+ {file = "pycryptodome-3.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:c53348358408d94869059e16fba5ff3bef8c52c25b18421472aba272b9bb450f"},
+ {file = "pycryptodome-3.9.4.tar.gz", hash = "sha256:a168e73879619b467072509a223282a02c8047d932a48b74fbd498f27224aa04"},
+]
+pyjwt = [
+ {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"},
+ {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"},
+]
+python-box = [
+ {file = "python-box-3.4.6.tar.gz", hash = "sha256:694a7555e3ff9fbbce734bbaef3aad92b8e4ed0659d3ed04d56b6a0a0eff26a9"},
+ {file = "python_box-3.4.6-py2.py3-none-any.whl", hash = "sha256:a71d3dc9dbaa34c8597d3517c89a8041bd62fa875f23c0f3dad55e1958e3ce10"},
+]
+python-dateutil = [
+ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"},
+ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
+]
+python-dotenv = [
+ {file = "python-dotenv-0.10.3.tar.gz", hash = "sha256:f157d71d5fec9d4bd5f51c82746b6344dffa680ee85217c123f4a0c8117c4544"},
+ {file = "python_dotenv-0.10.3-py2.py3-none-any.whl", hash = "sha256:debd928b49dbc2bf68040566f55cdb3252458036464806f4094487244e2a4093"},
+]
+python-memcached = [
+ {file = "python-memcached-1.59.tar.gz", hash = "sha256:a2e28637be13ee0bf1a8b6843e7490f9456fd3f2a4cb60471733c7b5d5557e4f"},
+ {file = "python_memcached-1.59-py2.py3-none-any.whl", hash = "sha256:4dac64916871bd3550263323fc2ce18e1e439080a2d5670c594cf3118d99b594"},
+]
+pytz = [
+ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"},
+ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"},
+]
+pyyaml = [
+ {file = "PyYAML-5.3-cp27-cp27m-win32.whl", hash = "sha256:940532b111b1952befd7db542c370887a8611660d2b9becff75d39355303d82d"},
+ {file = "PyYAML-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:059b2ee3194d718896c0ad077dd8c043e5e909d9180f387ce42012662a4946d6"},
+ {file = "PyYAML-5.3-cp35-cp35m-win32.whl", hash = "sha256:4fee71aa5bc6ed9d5f116327c04273e25ae31a3020386916905767ec4fc5317e"},
+ {file = "PyYAML-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:dbbb2379c19ed6042e8f11f2a2c66d39cceb8aeace421bfc29d085d93eda3689"},
+ {file = "PyYAML-5.3-cp36-cp36m-win32.whl", hash = "sha256:e3a057b7a64f1222b56e47bcff5e4b94c4f61faac04c7c4ecb1985e18caa3994"},
+ {file = "PyYAML-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:74782fbd4d4f87ff04159e986886931456a1894c61229be9eaf4de6f6e44b99e"},
+ {file = "PyYAML-5.3-cp37-cp37m-win32.whl", hash = "sha256:24521fa2890642614558b492b473bee0ac1f8057a7263156b02e8b14c88ce6f5"},
+ {file = "PyYAML-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:1cf708e2ac57f3aabc87405f04b86354f66799c8e62c28c5fc5f88b5521b2dbf"},
+ {file = "PyYAML-5.3-cp38-cp38-win32.whl", hash = "sha256:70024e02197337533eef7b85b068212420f950319cc8c580261963aefc75f811"},
+ {file = "PyYAML-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:cb1f2f5e426dc9f07a7681419fe39cee823bb74f723f36f70399123f439e9b20"},
+ {file = "PyYAML-5.3.tar.gz", hash = "sha256:e9f45bd5b92c7974e59bcd2dcc8631a6b6cc380a904725fce7bc08872e691615"},
+]
+qrcode = [
+ {file = "qrcode-6.1-py2.py3-none-any.whl", hash = "sha256:3996ee560fc39532910603704c82980ff6d4d5d629f9c3f25f34174ce8606cf5"},
+ {file = "qrcode-6.1.tar.gz", hash = "sha256:505253854f607f2abf4d16092c61d4e9d511a3b4392e60bff957a68592b04369"},
+]
+requests = [
+ {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"},
+ {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"},
+]
+six = [
+ {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"},
+ {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"},
+]
+soupsieve = [
+ {file = "soupsieve-1.9.5-py2.py3-none-any.whl", hash = "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5"},
+ {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"},
+]
+sqlparse = [
+ {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"},
+ {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"},
+]
+text-unidecode = [
+ {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"},
+ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"},
+]
+toml = [
+ {file = "toml-0.10.0-py2.7.egg", hash = "sha256:f1db651f9657708513243e61e6cc67d101a39bad662eaa9b5546f789338e07a3"},
+ {file = "toml-0.10.0-py2.py3-none-any.whl", hash = "sha256:235682dd292d5899d361a811df37e04a8828a5b1da3115886b73cf81ebc9100e"},
+ {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"},
+]
+twilio = [
+ {file = "twilio-6.35.2.tar.gz", hash = "sha256:a086443642c0e1f13c8f8f087b426ca81ec883efbe496d8279180a49bb9287bc"},
+]
+urllib3 = [
+ {file = "urllib3-1.25.7-py2.py3-none-any.whl", hash = "sha256:a8a318824cc77d1fd4b2bec2ded92646630d7fe8619497b142c84a9e6f5a7293"},
+ {file = "urllib3-1.25.7.tar.gz", hash = "sha256:f3c5fd51747d450d4dcf6f923c81f78f811aab8205fda64b0aba34a4e48b0745"},
+]
+yubiotp = [
+ {file = "YubiOTP-0.2.2.post1-py2.py3-none-any.whl", hash = "sha256:7e281801b24678f4bda855ce8ab975a7688a912f5a6cb22b6c2b16263a93cbd2"},
+ {file = "YubiOTP-0.2.2.post1.tar.gz", hash = "sha256:de83b1560226e38b5923f6ab919f962c8c2abb7c722104cb45b2b6db2ac86e40"},
+]
Index: AlekSIS/aleksis/core/templates/core/index.html
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/aleksis/core/templates/core/index.html (revision 9648eaaf23a9e45ba5ab180b973d79d8f2141efb)
+++ AlekSIS/aleksis/core/templates/core/index.html (revision e7ac0ec18d65e778e7d90e2731c22e8e1f447145)
@@ -22,6 +22,14 @@
</div>
{% endfor %}
+ <div class="row">
+ {% for widget in widgets %}
+ <div class="col s12 m12 l6 xl4">
+ {{ widget }}
+ </div>
+ {% endfor %}
+ </div>
+
<div class="row">
<div class="col s12 m6">
<h5>{% blocktrans %}Last activities{% endblocktrans %}</h5>
Index: AlekSIS/aleksis/core/views.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/aleksis/core/views.py (revision 9648eaaf23a9e45ba5ab180b973d79d8f2141efb)
+++ AlekSIS/aleksis/core/views.py (revision e7ac0ec18d65e778e7d90e2731c22e8e1f447145)
@@ -20,6 +20,8 @@
from .tables import GroupsTable, PersonsTable
from .util import messages
+from aleksis.apps.dashboardfeeds.views import get_widgets
+
@person_required
def index(request: HttpRequest) -> HttpResponse:
@@ -33,6 +35,8 @@
context["notifications"] = notifications
context["unread_notifications"] = unread_notifications
+ context["widgets"] = get_widgets(request)
+
return render(request, "core/index.html", context)
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0002_dashboardwidget_base_url.py
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0002_dashboardwidget_base_url.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/migrations/0002_dashboardwidget_base_url.py (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
@@ -0,0 +1,19 @@
+# Generated by Django 3.0.2 on 2020-01-13 21:07
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('dashboardfeeds', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='dashboardwidget',
+ name='base_url',
+ field=models.URLField(default='example.com', help_text='index url of the news website (as link for users)', verbose_name='Base URL'),
+ preserve_default=False,
+ ),
+ ]
Index: AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/rss.html
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/rss.html (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
+++ AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/templates/dashboardfeeds/rss.html (revision f320d5a89055ce5e0f9e7c97a072a15443dc25d2)
@@ -0,0 +1,18 @@
+{% load i18n static %}
+
+<div class="card">
+ <div class="card-image">
+ <span class="badge-image z-depth-2">{{ title }}</span>
+ {# <img src="{{ result.enclosures.0.href }}" alt="{{ title }} – {% trans "title image" %}">#}
+ <img src="{{ result.enclosures.0.href }}" alt="{{ title }} – {% trans "title image" %}"
+ onerror="this.src='{% static "dashboardfeeds/image_not_found.png" %}'; "/>
+ </div>
+ {# THIS DOSEN'T WOKR! #}
+ <div class="card-content"><span class="card-title">{{ result.title }}</span>
+ {{ result.summary|safe }}
+ </div>
+ <div class="card-action">
+ <a href="{{ result.link }}" target="_blank">Mehr lesen</a>
+ </div>
+</div><a class="btn hundred-percent primary-color" href="{{ base_url }}" target="_blank">Weitere
+ Artikel<i class="material-icons right">arrow_forward</i></a>
diff --git AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/locale/.keepdir AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/locale/.keepdir
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
diff --git AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/static/.keepdir AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/static/.keepdir
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
diff --git AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/static/dashboardfeeds/image_not_found.png AlekSIS/apps/official/AlekSIS-App-DashboardFeeds/aleksis/apps/dashboardfeeds/static/dashboardfeeds/image_not_found.png
new file mode 100644
index 0000000000000000000000000000000000000000..8ad0620f8b0954ae3676ddc706e112de2042d1e4
GIT binary patch
literal 51251
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
XPGy)sPP_eOG=6vC>~<`)KaltzO8-p~
......@@ -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"]
......