df_site 0.1.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- df_site/__init__.py +1 -0
- df_site/__main__.py +37 -0
- df_site/admin.py +130 -0
- df_site/apps.py +57 -0
- df_site/components/__init__.py +1 -0
- df_site/components/base.py +82 -0
- df_site/components/detail.py +191 -0
- df_site/components/list.py +446 -0
- df_site/components/list_filters.py +74 -0
- df_site/components/registry.py +55 -0
- df_site/constants.py +71 -0
- df_site/context_processors.py +61 -0
- df_site/defaults.py +319 -0
- df_site/dynamic_settings.py +37 -0
- df_site/form_fields.py +138 -0
- df_site/management/__init__.py +1 -0
- df_site/management/commands/__init__.py +1 -0
- df_site/management/commands/add_image.py +104 -0
- df_site/management/commands/generate_favicon.py +47 -0
- df_site/middleware.py +20 -0
- df_site/migrations/0001_initial.py +220 -0
- df_site/migrations/0002_alter_alertribbon_message_alter_alertribbon_summary.py +23 -0
- df_site/migrations/__init__.py +0 -0
- df_site/model_fields.py +35 -0
- df_site/models.py +130 -0
- df_site/postman/__init__.py +1 -0
- df_site/postman/forms.py +38 -0
- df_site/postman/urls.py +75 -0
- df_site/postman/views.py +65 -0
- df_site/static/css/app.css +0 -0
- df_site/static/css/base.css +22208 -0
- df_site/static/css/ckeditor5.css +422 -0
- df_site/static/favicon/android-chrome-192x192.png +0 -0
- df_site/static/favicon/android-chrome-512x512.png +0 -0
- df_site/static/favicon/apple-touch-icon.png +0 -0
- df_site/static/favicon/favicon-16x16.png +0 -0
- df_site/static/favicon/favicon-32x32.png +0 -0
- df_site/static/favicon/favicon.ico +0 -0
- df_site/static/favicon/mstile-150x150.png +0 -0
- df_site/static/favicon/safari-pinned-tab.svg +46 -0
- df_site/static/images/accessibility.svg +1 -0
- df_site/static/images/align-bottom.svg +1 -0
- df_site/static/images/align-center.svg +1 -0
- df_site/static/images/align-justify.svg +1 -0
- df_site/static/images/align-left.svg +1 -0
- df_site/static/images/align-middle.svg +1 -0
- df_site/static/images/align-right.svg +1 -0
- df_site/static/images/align-top.svg +1 -0
- df_site/static/images/bold.svg +1 -0
- df_site/static/images/browse-files.svg +1 -0
- df_site/static/images/bulletedlist.svg +1 -0
- df_site/static/images/cancel.svg +1 -0
- df_site/static/images/caption.svg +1 -0
- df_site/static/images/check.svg +1 -0
- df_site/static/images/code.svg +1 -0
- df_site/static/images/codeblock.svg +1 -0
- df_site/static/images/cog.svg +1 -0
- df_site/static/images/color-palette.svg +1 -0
- df_site/static/images/color-tile-check.svg +1 -0
- df_site/static/images/drag-handle.svg +1 -0
- df_site/static/images/drag-indicator.svg +1 -0
- df_site/static/images/dropdown-arrow.svg +1 -0
- df_site/static/images/eraser.svg +1 -0
- df_site/static/images/file-arrow-up-solid.svg +1 -0
- df_site/static/images/find-replace.svg +1 -0
- df_site/static/images/font-background.svg +1 -0
- df_site/static/images/font-color.svg +1 -0
- df_site/static/images/font-family.svg +1 -0
- df_site/static/images/font-size.svg +1 -0
- df_site/static/images/heading1.svg +1 -0
- df_site/static/images/heading2.svg +1 -0
- df_site/static/images/heading3.svg +1 -0
- df_site/static/images/heading4.svg +1 -0
- df_site/static/images/heading5.svg +1 -0
- df_site/static/images/heading6.svg +1 -0
- df_site/static/images/history.svg +1 -0
- df_site/static/images/horizontalline.svg +1 -0
- df_site/static/images/html.svg +1 -0
- df_site/static/images/image-asset-manager.svg +1 -0
- df_site/static/images/image-upload.svg +1 -0
- df_site/static/images/image-url.svg +1 -0
- df_site/static/images/image.svg +1 -0
- df_site/static/images/importexport.svg +1 -0
- df_site/static/images/indent.svg +1 -0
- df_site/static/images/italic.svg +1 -0
- df_site/static/images/link.svg +1 -0
- df_site/static/images/liststylecircle.svg +1 -0
- df_site/static/images/liststyledecimal.svg +1 -0
- df_site/static/images/liststyledecimalleadingzero.svg +1 -0
- df_site/static/images/liststyledisc.svg +1 -0
- df_site/static/images/liststylelowerlatin.svg +1 -0
- df_site/static/images/liststylelowerroman.svg +1 -0
- df_site/static/images/liststylesquare.svg +1 -0
- df_site/static/images/liststyleupperlatin.svg +1 -0
- df_site/static/images/liststyleupperroman.svg +1 -0
- df_site/static/images/loupe.svg +1 -0
- df_site/static/images/low-vision.svg +1 -0
- df_site/static/images/marker.svg +1 -0
- df_site/static/images/media-placeholder.svg +1 -0
- df_site/static/images/media.svg +1 -0
- df_site/static/images/next-arrow.svg +1 -0
- df_site/static/images/numberedlist.svg +1 -0
- df_site/static/images/object-center.svg +1 -0
- df_site/static/images/object-full-width.svg +1 -0
- df_site/static/images/object-inline-left.svg +1 -0
- df_site/static/images/object-inline-right.svg +1 -0
- df_site/static/images/object-inline.svg +1 -0
- df_site/static/images/object-left.svg +1 -0
- df_site/static/images/object-right.svg +1 -0
- df_site/static/images/object-size-custom.svg +1 -0
- df_site/static/images/object-size-full.svg +1 -0
- df_site/static/images/object-size-large.svg +1 -0
- df_site/static/images/object-size-medium.svg +1 -0
- df_site/static/images/object-size-small.svg +1 -0
- df_site/static/images/outdent.svg +1 -0
- df_site/static/images/paragraph.svg +1 -0
- df_site/static/images/pen.svg +1 -0
- df_site/static/images/pencil.svg +1 -0
- df_site/static/images/pilcrow.svg +1 -0
- df_site/static/images/plus.svg +1 -0
- df_site/static/images/previous-arrow.svg +1 -0
- df_site/static/images/project-logo.svg +1 -0
- df_site/static/images/quote.svg +1 -0
- df_site/static/images/redo.svg +1 -0
- df_site/static/images/remove-format.svg +1 -0
- df_site/static/images/return-arrow.svg +1 -0
- df_site/static/images/select-all.svg +1 -0
- df_site/static/images/show-blocks.svg +1 -0
- df_site/static/images/source-editing.svg +1 -0
- df_site/static/images/specialcharacters.svg +1 -0
- df_site/static/images/strikethrough.svg +1 -0
- df_site/static/images/subscript.svg +1 -0
- df_site/static/images/superscript.svg +1 -0
- df_site/static/images/table-cell-properties.svg +1 -0
- df_site/static/images/table-column.svg +1 -0
- df_site/static/images/table-merge-cell.svg +1 -0
- df_site/static/images/table-properties.svg +1 -0
- df_site/static/images/table-row.svg +1 -0
- df_site/static/images/table.svg +1 -0
- df_site/static/images/text-alternative.svg +1 -0
- df_site/static/images/text.svg +1 -0
- df_site/static/images/three-vertical-dots.svg +1 -0
- df_site/static/images/todolist.svg +1 -0
- df_site/static/images/underline.svg +1 -0
- df_site/static/images/undo.svg +1 -0
- df_site/static/images/unlink.svg +1 -0
- df_site/static/js/app.js +98 -0
- df_site/static/js/app.js.map +1 -0
- df_site/static/js/base.js +161181 -0
- df_site/static/js/base.js.map +1 -0
- df_site/static/translations/af.js +1 -0
- df_site/static/translations/ar.js +1 -0
- df_site/static/translations/ast.js +1 -0
- df_site/static/translations/az.js +1 -0
- df_site/static/translations/bg.js +1 -0
- df_site/static/translations/bn.js +1 -0
- df_site/static/translations/bs.js +1 -0
- df_site/static/translations/ca.js +1 -0
- df_site/static/translations/cs.js +1 -0
- df_site/static/translations/da.js +1 -0
- df_site/static/translations/de-ch.js +1 -0
- df_site/static/translations/de.js +1 -0
- df_site/static/translations/el.js +1 -0
- df_site/static/translations/en-au.js +1 -0
- df_site/static/translations/en-gb.js +1 -0
- df_site/static/translations/en.js +1 -0
- df_site/static/translations/eo.js +1 -0
- df_site/static/translations/es-co.js +1 -0
- df_site/static/translations/es.js +1 -0
- df_site/static/translations/et.js +1 -0
- df_site/static/translations/eu.js +1 -0
- df_site/static/translations/fa.js +1 -0
- df_site/static/translations/fi.js +1 -0
- df_site/static/translations/gl.js +1 -0
- df_site/static/translations/gu.js +1 -0
- df_site/static/translations/he.js +1 -0
- df_site/static/translations/hi.js +1 -0
- df_site/static/translations/hr.js +1 -0
- df_site/static/translations/hu.js +1 -0
- df_site/static/translations/hy.js +1 -0
- df_site/static/translations/id.js +1 -0
- df_site/static/translations/it.js +1 -0
- df_site/static/translations/ja.js +1 -0
- df_site/static/translations/jv.js +1 -0
- df_site/static/translations/kk.js +1 -0
- df_site/static/translations/km.js +1 -0
- df_site/static/translations/kn.js +1 -0
- df_site/static/translations/ko.js +1 -0
- df_site/static/translations/ku.js +1 -0
- df_site/static/translations/lt.js +1 -0
- df_site/static/translations/lv.js +1 -0
- df_site/static/translations/ms.js +1 -0
- df_site/static/translations/nb.js +1 -0
- df_site/static/translations/ne.js +1 -0
- df_site/static/translations/nl.js +1 -0
- df_site/static/translations/no.js +1 -0
- df_site/static/translations/oc.js +1 -0
- df_site/static/translations/pl.js +1 -0
- df_site/static/translations/pt-br.js +1 -0
- df_site/static/translations/pt.js +1 -0
- df_site/static/translations/ro.js +1 -0
- df_site/static/translations/ru.js +1 -0
- df_site/static/translations/si.js +1 -0
- df_site/static/translations/sk.js +1 -0
- df_site/static/translations/sl.js +1 -0
- df_site/static/translations/sq.js +1 -0
- df_site/static/translations/sr-latn.js +1 -0
- df_site/static/translations/sr.js +1 -0
- df_site/static/translations/sv.js +1 -0
- df_site/static/translations/th.js +1 -0
- df_site/static/translations/ti.js +1 -0
- df_site/static/translations/tk.js +1 -0
- df_site/static/translations/tr.js +1 -0
- df_site/static/translations/tt.js +1 -0
- df_site/static/translations/ug.js +1 -0
- df_site/static/translations/uk.js +1 -0
- df_site/static/translations/ur.js +1 -0
- df_site/static/translations/uz.js +1 -0
- df_site/static/translations/vi.js +1 -0
- df_site/static/translations/zh-cn.js +1 -0
- df_site/static/translations/zh.js +1 -0
- df_site/static/webfonts/fa-brands-400.ttf +0 -0
- df_site/static/webfonts/fa-brands-400.woff2 +0 -0
- df_site/static/webfonts/fa-regular-400.ttf +0 -0
- df_site/static/webfonts/fa-regular-400.woff2 +0 -0
- df_site/static/webfonts/fa-solid-900.ttf +0 -0
- df_site/static/webfonts/fa-solid-900.woff2 +0 -0
- df_site/static/webfonts/fa-v4compatibility.ttf +0 -0
- df_site/static/webfonts/fa-v4compatibility.woff2 +0 -0
- df_site/templates/account/email.html +78 -0
- df_site/templates/account/password_change.html +28 -0
- df_site/templates/account/snippets/warn_no_email.html +6 -0
- df_site/templates/allauth/elements/alert.html +6 -0
- df_site/templates/allauth/elements/badge.html +4 -0
- df_site/templates/allauth/elements/button.html +14 -0
- df_site/templates/allauth/elements/button_group.html +5 -0
- df_site/templates/allauth/elements/field.html +72 -0
- df_site/templates/allauth/elements/fields.html +3 -0
- df_site/templates/allauth/elements/form.html +10 -0
- df_site/templates/allauth/elements/h1.html +1 -0
- df_site/templates/allauth/elements/h2.html +1 -0
- df_site/templates/allauth/elements/img.html +4 -0
- df_site/templates/allauth/elements/p.html +1 -0
- df_site/templates/allauth/elements/panel.html +14 -0
- df_site/templates/allauth/elements/provider.html +6 -0
- df_site/templates/allauth/elements/provider_list.html +5 -0
- df_site/templates/allauth/elements/table.html +5 -0
- df_site/templates/allauth/layouts/base.html +14 -0
- df_site/templates/allauth/layouts/entrance.html +20 -0
- df_site/templates/allauth/layouts/manage.html +1 -0
- df_site/templates/cookie_consent/_cookie_group.html +64 -0
- df_site/templates/cookie_consent/cookiegroup_list.html +23 -0
- df_site/templates/df_components/base.html +0 -0
- df_site/templates/df_components/detail.html +12 -0
- df_site/templates/df_components/detail_fieldset.html +46 -0
- df_site/templates/df_components/list.html +42 -0
- df_site/templates/df_components/list_filter.html +13 -0
- df_site/templates/df_components/list_filters.html +36 -0
- df_site/templates/df_components/list_hierarchy.html +25 -0
- df_site/templates/df_components/list_pagination.html +39 -0
- df_site/templates/df_components/list_search_form.html +38 -0
- df_site/templates/df_components/list_table.html +35 -0
- df_site/templates/df_site/app.html +1 -0
- df_site/templates/df_site/base.html +221 -0
- df_site/templates/df_site/detail.html +8 -0
- df_site/templates/df_site/humans.txt +11 -0
- df_site/templates/df_site/manage_base.html +51 -0
- df_site/templates/df_site/popup_app.html +1 -0
- df_site/templates/df_site/popup_base.html +29 -0
- df_site/templates/df_site/security.txt +5 -0
- df_site/templates/django_bootstrap5/breadcrumb.html +17 -0
- df_site/templates/django_bootstrap5/pagination.html +40 -0
- df_site/templates/django_ckeditor_5/widget.html +13 -0
- df_site/templates/favicon/browserconfig.xml +9 -0
- df_site/templates/mfa/index.html +115 -0
- df_site/templates/mfa/recovery_codes/index.html +33 -0
- df_site/templates/mfa/webauthn/authenticator_list.html +74 -0
- df_site/templates/pipeline/css.html +1 -0
- df_site/templates/pipeline/js.html +1 -0
- df_site/templates/postman/archives.html +8 -0
- df_site/templates/postman/base.html +20 -0
- df_site/templates/postman/base_folder.html +71 -0
- df_site/templates/postman/base_write.html +26 -0
- df_site/templates/postman/inbox.html +7 -0
- df_site/templates/postman/inc_subject_ex.html +21 -0
- df_site/templates/postman/trash.html +12 -0
- df_site/templates/postman/view.html +64 -0
- df_site/templates/users/settings.html +26 -0
- df_site/templates/usersessions/usersession_list.html +70 -0
- df_site/templatetags/__init__.py +1 -0
- df_site/templatetags/df_site.py +241 -0
- df_site/templatetags/images.py +515 -0
- df_site/templatetags/pipeline_sri.py +97 -0
- df_site/testing/__init__.py +1 -0
- df_site/testing/multiple_views.py +369 -0
- df_site/testing/requests.py +299 -0
- df_site/urls.py +41 -0
- df_site/user_settings.py +69 -0
- df_site/users/__init__.py +1 -0
- df_site/users/forms.py +35 -0
- df_site/users/notifications.py +14 -0
- df_site/users/urls.py +17 -0
- df_site/users/views.py +75 -0
- df_site/views.py +122 -0
- df_site-0.1.0.dist-info/LICENSE +519 -0
- df_site-0.1.0.dist-info/METADATA +217 -0
- df_site-0.1.0.dist-info/RECORD +309 -0
- df_site-0.1.0.dist-info/WHEEL +4 -0
- df_site-0.1.0.dist-info/entry_points.txt +3 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
{% extends "df_site/app.html" %}
|
2
|
+
{% load i18n cookie_consent_tags %}
|
3
|
+
{% block body_classes %}d-flex align-items-center py-lg-4 text-bg-body-secondary{% endblock body_classes %}
|
4
|
+
{% block navbar %}{% endblock navbar %}
|
5
|
+
|
6
|
+
{% block body %}
|
7
|
+
<main class="container pt-lg-5">
|
8
|
+
<div class="row mt-lg-5">
|
9
|
+
{% block popup_body %}
|
10
|
+
<div class="col-md-4 offset-md-4 bg-body-tertiary p-0">
|
11
|
+
<nav class="navbar sticky-top text-bg-primary mb-5 text-center">
|
12
|
+
{% block popup_title %}
|
13
|
+
<a class="w-100 nav-link text-light fs-3"
|
14
|
+
href="{% url 'index' %}">{{ PAGE_TITLE|default:DF_SITE_TITLE }}</a>
|
15
|
+
{% endblock popup_title %}
|
16
|
+
</nav>
|
17
|
+
<div class="m-2">
|
18
|
+
{% block popup_content %}
|
19
|
+
{% endblock popup_content %}
|
20
|
+
</div>
|
21
|
+
{% block popup_copyright %}
|
22
|
+
<p class="mx-2 mt-5 mb-3 text-body-secondary">© {% now "Y" %} {{ DF_SITE_ORGANIZATION }}</p>
|
23
|
+
{% endblock popup_copyright %}
|
24
|
+
</div>
|
25
|
+
{% endblock popup_body %}
|
26
|
+
</div>
|
27
|
+
</main>
|
28
|
+
{% endblock body %}
|
29
|
+
|
@@ -0,0 +1,17 @@
|
|
1
|
+
{% if breadcrumbs %}
|
2
|
+
<nav aria-label="breadcrumb">
|
3
|
+
<ol class="breadcrumb mx-1">
|
4
|
+
{% for crumb in breadcrumbs %}
|
5
|
+
{% if forloop.last and last_active %}
|
6
|
+
<li class="breadcrumb-item active{{ extra_classes }}" aria-current="page">{{ crumb.title }}</li>
|
7
|
+
{% elif crumb.link and not crumb.active %}
|
8
|
+
<li class="breadcrumb-item{{ extra_classes }}"><a href="{{ crumb.link }}">{{ crumb.title }}</a></li>
|
9
|
+
{% elif not crumb.active %}
|
10
|
+
<li class="breadcrumb-item{{ extra_classes }}">{{ crumb.title }}</li>
|
11
|
+
{% else %}
|
12
|
+
<li class="breadcrumb-item active{{ extra_classes }}" aria-current="page">{{ crumb.title }}</li>
|
13
|
+
{% endif %}
|
14
|
+
{% endfor %}
|
15
|
+
</ol>
|
16
|
+
</nav>
|
17
|
+
{% endif %}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
{% load django_bootstrap5 %}
|
2
|
+
{% if num_pages > 1 %}
|
3
|
+
{% with url=bootstrap_pagination_url|default:"" %}
|
4
|
+
<nav>
|
5
|
+
<ul class="{{ pagination_css_classes }}">
|
6
|
+
<li class="page-item{% if current_page == 1 %} disabled{% endif %}">
|
7
|
+
<a class="page-link"
|
8
|
+
href="{% if current_page == 1 %}#{% else %}{% bootstrap_url_replace_param url parameter_name 1 %}{% endif %}">
|
9
|
+
«
|
10
|
+
</a>
|
11
|
+
</li>
|
12
|
+
{% if pages_back %}
|
13
|
+
<li class="page-item">
|
14
|
+
<a class="page-link"
|
15
|
+
href="{% bootstrap_url_replace_param url parameter_name pages_back %}">…</a>
|
16
|
+
</li>
|
17
|
+
{% endif %}
|
18
|
+
{% for page in pages_shown %}
|
19
|
+
<li class="page-item{% if current_page == page %} active{% endif %}">
|
20
|
+
<a class="page-link"
|
21
|
+
href="{% if current_page == page %}#{% else %}{% bootstrap_url_replace_param url parameter_name page %}{% endif %}">
|
22
|
+
{{ page }}
|
23
|
+
</a>
|
24
|
+
</li>
|
25
|
+
{% endfor %}
|
26
|
+
{% if pages_forward %}
|
27
|
+
<li class="page-item">
|
28
|
+
<a class="page-link" href="{% bootstrap_url_replace_param url parameter_name pages_forward %}">…</a>
|
29
|
+
</li>
|
30
|
+
{% endif %}
|
31
|
+
<li class="page-item{% if current_page == num_pages %} disabled{% endif %}">
|
32
|
+
<a class="page-link"
|
33
|
+
href="{% if current_page == num_pages %}#{% else %}{% bootstrap_url_replace_param url parameter_name num_pages %}{% endif %}">
|
34
|
+
»
|
35
|
+
</a>
|
36
|
+
</li>
|
37
|
+
</ul>
|
38
|
+
</nav>
|
39
|
+
{% endwith %}
|
40
|
+
{% endif %}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
{% load django_bootstrap5 %}
|
2
|
+
<div class="ck-editor-container form-control p-0{% if 'ck-editor__singleline' in widget.attrs.class %} ck-editor__singleline{% endif %}{% if 'is-valid' in widget.attrs.class %} is-valid{% elif 'is-invalid' in widget.attrs.class %} is-invalid{% endif %}">
|
3
|
+
<textarea name="{{ widget.name }}" {% include 'django/forms/widgets/attrs.html' %}>{% if widget.value %}{{ widget.value }}{% endif %}</textarea>
|
4
|
+
<div class="word-count d-none" id="{{ script_id }}-word-count"></div>
|
5
|
+
{% if errors %}
|
6
|
+
{% for text in errors %}
|
7
|
+
<div class="invalid-feedback">{{ text }}</div>
|
8
|
+
{% endfor %}
|
9
|
+
{% endif %}
|
10
|
+
<input type="hidden" id="{{ script_id }}-ck-editor-5-upload-url" data-upload-url="{{ upload_url }}"
|
11
|
+
data-upload-file-types="{{ upload_file_types }}" data-csrf_cookie_name="{{ csrf_cookie_name }}">
|
12
|
+
<span id="{{ script_id }}-span">{{ config|json_script:script_id }}</span>
|
13
|
+
</div>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?><!-- {% load static %} -->
|
2
|
+
<browserconfig>
|
3
|
+
<msapplication>
|
4
|
+
<tile>
|
5
|
+
<square150x150logo src="{% static 'favicon/mstile-150x150.png' %}"/>
|
6
|
+
<TileColor>{{ DF_MICROSOFT_BACKGROUND_COLOR }}</TileColor>
|
7
|
+
</tile>
|
8
|
+
</msapplication>
|
9
|
+
</browserconfig>
|
@@ -0,0 +1,115 @@
|
|
1
|
+
{% extends "mfa/base_manage.html" %}
|
2
|
+
{% load allauth %}
|
3
|
+
{% load i18n %}
|
4
|
+
{% block head_title %}
|
5
|
+
{% trans "Two-Factor Authentication" %}
|
6
|
+
{% endblock head_title %}
|
7
|
+
{% block content %}
|
8
|
+
{% element h1 tags="mfa,index" %}
|
9
|
+
{% trans "Two-Factor Authentication" %}
|
10
|
+
{% endelement %}
|
11
|
+
{% if "totp" in MFA_SUPPORTED_TYPES %}
|
12
|
+
{% element panel %}
|
13
|
+
{% slot title %}
|
14
|
+
{% translate "Authenticator App" %}
|
15
|
+
{% endslot %}
|
16
|
+
{% slot body %}
|
17
|
+
{% if authenticators.totp %}
|
18
|
+
{% element p %}
|
19
|
+
{% translate "Authentication using an authenticator app is active." %}
|
20
|
+
{% endelement %}
|
21
|
+
{% else %}
|
22
|
+
{% element p %}
|
23
|
+
{% translate "An authenticator app is not active." %}
|
24
|
+
{% endelement %}
|
25
|
+
{% endif %}
|
26
|
+
{% endslot %}
|
27
|
+
{% slot actions %}
|
28
|
+
{% url 'mfa_deactivate_totp' as deactivate_url %}
|
29
|
+
{% url 'mfa_activate_totp' as activate_url %}
|
30
|
+
{% if authenticators.totp %}
|
31
|
+
{% element button href=deactivate_url tags="danger,delete,panel" %}
|
32
|
+
{% translate "Deactivate" %}
|
33
|
+
{% endelement %}
|
34
|
+
{% else %}
|
35
|
+
{% element button href=activate_url tags="panel" %}
|
36
|
+
{% translate "Activate" %}
|
37
|
+
{% endelement %}
|
38
|
+
{% endif %}
|
39
|
+
{% endslot %}
|
40
|
+
{% endelement %}
|
41
|
+
{% endif %}
|
42
|
+
{% if "webauthn" in MFA_SUPPORTED_TYPES %}
|
43
|
+
{% element panel %}
|
44
|
+
{% slot title %}
|
45
|
+
{% translate "Security Keys" %}
|
46
|
+
{% endslot %}
|
47
|
+
{% slot body %}
|
48
|
+
{% if authenticators.webauthn|length %}
|
49
|
+
{% element p %}
|
50
|
+
{% blocktranslate count count=authenticators.webauthn|length %}You have added {{ count }} security key.{% plural %}You have added {{ count }} security keys.{% endblocktranslate %}
|
51
|
+
{% endelement %}
|
52
|
+
{% else %}
|
53
|
+
{% element p %}{% translate "No security keys have been added." %}{% endelement %}
|
54
|
+
{% endif %}
|
55
|
+
{% endslot %}
|
56
|
+
{% slot actions %}
|
57
|
+
{% if authenticators.webauthn|length %}
|
58
|
+
{% url 'mfa_list_webauthn' as webauthn_list_url %}
|
59
|
+
{% element button href=webauthn_list_url %}
|
60
|
+
{% translate "Manage" %}
|
61
|
+
{% endelement %}
|
62
|
+
{% else %}
|
63
|
+
{% url 'mfa_add_webauthn' as webauthn_add_url %}
|
64
|
+
{% element button href=webauthn_add_url %}
|
65
|
+
{% translate "Add" %}
|
66
|
+
{% endelement %}
|
67
|
+
{% endif %}
|
68
|
+
{% endslot %}
|
69
|
+
{% endelement %}
|
70
|
+
{% endif %}
|
71
|
+
{% if "recovery_codes" in MFA_SUPPORTED_TYPES %}
|
72
|
+
{% with total_count=authenticators.recovery_codes.generate_codes|length unused_count=authenticators.recovery_codes.get_unused_codes|length %}
|
73
|
+
{% element panel %}
|
74
|
+
{% slot title %}
|
75
|
+
{% translate "Recovery Codes" %}
|
76
|
+
{% endslot %}
|
77
|
+
{% slot body %}
|
78
|
+
{% if authenticators.recovery_codes %}
|
79
|
+
{% element p %}
|
80
|
+
{% blocktranslate count unused_count=unused_count %}There is {{ unused_count }} out of {{ total_count }} recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes available.{% endblocktranslate %}
|
81
|
+
{% endelement %}
|
82
|
+
{% else %}
|
83
|
+
{% element p %}
|
84
|
+
{% translate "No recovery codes set up." %}
|
85
|
+
{% endelement %}
|
86
|
+
{% endif %}
|
87
|
+
{% endslot %}
|
88
|
+
{% if is_mfa_enabled %}
|
89
|
+
{% if authenticators.recovery_codes %}
|
90
|
+
{% if unused_count > 0 %}
|
91
|
+
{% slot actions %}
|
92
|
+
{% url 'mfa_view_recovery_codes' as view_url %}
|
93
|
+
{% element button href=view_url tags="panel" %}
|
94
|
+
{% translate "View" %}
|
95
|
+
{% endelement %}
|
96
|
+
{% endslot %}
|
97
|
+
{% slot actions %}
|
98
|
+
{% url 'mfa_download_recovery_codes' as download_url %}
|
99
|
+
{% element button href=download_url tags="secondary,panel" %}
|
100
|
+
{% translate "Download" %}
|
101
|
+
{% endelement %}
|
102
|
+
{% endslot %}
|
103
|
+
{% endif %}
|
104
|
+
{% endif %}
|
105
|
+
{% slot actions %}
|
106
|
+
{% url 'mfa_generate_recovery_codes' as generate_url %}
|
107
|
+
{% element button href=generate_url tags="secondary,panel" %}
|
108
|
+
{% translate "Generate" %}
|
109
|
+
{% endelement %}
|
110
|
+
{% endslot %}
|
111
|
+
{% endif %}
|
112
|
+
{% endelement %}
|
113
|
+
{% endwith %}
|
114
|
+
{% endif %}
|
115
|
+
{% endblock content %}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
{% extends "mfa/recovery_codes/base.html" %}
|
2
|
+
{% load i18n allauth %}
|
3
|
+
{% block content %}
|
4
|
+
{% element h1 %}
|
5
|
+
{% translate "Recovery Codes" %}
|
6
|
+
{% endelement %}
|
7
|
+
{% element p %}
|
8
|
+
{% blocktranslate count unused_count=unused_codes|length %}There is {{ unused_count }} out of {{ total_count }}
|
9
|
+
recovery codes available.{% plural %}There are {{ unused_count }} out of {{ total_count }} recovery codes
|
10
|
+
available.{% endblocktranslate %}
|
11
|
+
{% endelement %}
|
12
|
+
{% element field id="recovery_codes" type="textarea" disabled=True rows=unused_codes|length readonly=True monospace=True %}
|
13
|
+
{% slot label %}
|
14
|
+
{% translate "Unused codes" %}
|
15
|
+
{% endslot %}
|
16
|
+
{% comment %} djlint:off {% endcomment %}
|
17
|
+
{% slot value %}{% for code in unused_codes %}{% if forloop.counter0 %}
|
18
|
+
{% endif %}{{ code }}{% endfor %}{% endslot %}
|
19
|
+
{% comment %} djlint:on {% endcomment %}
|
20
|
+
{% endelement %}
|
21
|
+
<div class="p-3 btn-group">
|
22
|
+
{% if unused_codes %}
|
23
|
+
{% url 'mfa_download_recovery_codes' as download_url %}
|
24
|
+
{% element button href=download_url %}
|
25
|
+
{% translate "Download codes" %}
|
26
|
+
{% endelement %}
|
27
|
+
{% endif %}
|
28
|
+
{% url 'mfa_generate_recovery_codes' as generate_url %}
|
29
|
+
{% element button href=generate_url %}
|
30
|
+
{% translate "Generate new codes" %}
|
31
|
+
{% endelement %}
|
32
|
+
</div>
|
33
|
+
{% endblock content %}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
{% extends "mfa/webauthn/base.html" %}
|
2
|
+
{% load i18n %}
|
3
|
+
{% load static %}
|
4
|
+
{% load allauth %}
|
5
|
+
{% load humanize %}
|
6
|
+
{% block content %}
|
7
|
+
{% element h1 %}
|
8
|
+
{% trans "Security Keys" %}
|
9
|
+
{% endelement %}
|
10
|
+
{% if authenticators|length == 0 %}
|
11
|
+
{% element th %}
|
12
|
+
{% blocktranslate %}No security keys have been added.{% endblocktranslate %}
|
13
|
+
{% endelement %}
|
14
|
+
{% else %}
|
15
|
+
{% element table %}
|
16
|
+
{% element thead %}
|
17
|
+
{% element th %}
|
18
|
+
{% translate "Key" %}
|
19
|
+
{% endelement %}
|
20
|
+
{% element th %}
|
21
|
+
{% translate "Usage" %}
|
22
|
+
{% endelement %}
|
23
|
+
{% element th %}
|
24
|
+
{% endelement %}
|
25
|
+
{% endelement %}
|
26
|
+
{% element tbody %}
|
27
|
+
{% for authenticator in authenticators %}
|
28
|
+
{% element tr %}
|
29
|
+
{% element td %}
|
30
|
+
{{ authenticator }}
|
31
|
+
{% if authenticator.wrap.is_passwordless is True %}
|
32
|
+
{% element badge tags="mfa,key,primary" %}
|
33
|
+
{% translate "Passkey" %}
|
34
|
+
{% endelement %}
|
35
|
+
{% elif authenticator.wrap.is_passwordless is False %}
|
36
|
+
{% element badge tags="mfa,key,secondary" %}
|
37
|
+
{% translate "Security key" %}
|
38
|
+
{% endelement %}
|
39
|
+
{% else %}
|
40
|
+
{% element badge title=_("This key does not indicate whether it is a passkey.") tags="mfa,key,warning" %}
|
41
|
+
{% translate "Unspecified" %}
|
42
|
+
{% endelement %}
|
43
|
+
{% endif %}
|
44
|
+
{% endelement %}
|
45
|
+
{% element td %}
|
46
|
+
{% blocktranslate with created_at=authenticator.created_at|date:"SHORT_DATE_FORMAT" %}Added on {{ created_at }}{% endblocktranslate %}.
|
47
|
+
{% if authenticator.last_used_at %}
|
48
|
+
{% blocktranslate with last_used=authenticator.last_used_at|naturaltime %}Last used {{ last_used }}{% endblocktranslate %}
|
49
|
+
{% else %}
|
50
|
+
Not used.
|
51
|
+
{% endif %}
|
52
|
+
{% endelement %}
|
53
|
+
{% element td align="right" %}
|
54
|
+
{% url 'mfa_edit_webauthn' pk=authenticator.pk as edit_url %}
|
55
|
+
{% element button tags="mfa,authenticator,edit,tool" href=edit_url %}
|
56
|
+
{% translate "Edit" %}
|
57
|
+
{% endelement %}
|
58
|
+
{% url 'mfa_remove_webauthn' pk=authenticator.pk as remove_url %}
|
59
|
+
{% element button tags="mfa,authenticator,danger,delete,tool" href=remove_url %}
|
60
|
+
{% translate "Remove" %}
|
61
|
+
{% endelement %}
|
62
|
+
{% endelement %}
|
63
|
+
{% endelement %}
|
64
|
+
{% endfor %}
|
65
|
+
{% endelement %}
|
66
|
+
{% endelement %}
|
67
|
+
{% endif %}
|
68
|
+
{% url 'mfa_add_webauthn' as add_url %}
|
69
|
+
{% element button href=add_url %}
|
70
|
+
{% translate "Add" %}
|
71
|
+
{% endelement %}
|
72
|
+
</li>
|
73
|
+
</ul>
|
74
|
+
{% endblock %}
|
@@ -0,0 +1 @@
|
|
1
|
+
<link href="{{ url }}" rel="stylesheet" type="{{ type }}" media="{{ media|default:"all" }}"{% if title %} title="{{ title }}"{% endif %}{% if charset %} charset="{{ charset }}"{% endif %}{% if integrity %} integrity="{{ integrity }}"{% endif %}{% if crossorigin %} crossorigin="{{ crossorigin }}"{% endif %} />
|
@@ -0,0 +1 @@
|
|
1
|
+
<script{% if async %} async{% endif %}{% if defer %} defer{% endif %} {% if type != 'text/javascript' %}type="{{ type }}" {% endif %}src="{{ url }}" {% if integrity %} integrity="{{ integrity }}"{% endif %}{% if crossorigin %} crossorigin="{{ crossorigin }}"{% endif %}></script>
|
@@ -0,0 +1,8 @@
|
|
1
|
+
{% extends "postman/base_folder.html" %}
|
2
|
+
{% load i18n allauth %}
|
3
|
+
{% block pm_folder_title %}{% trans "Archived Messages" %}{% endblock %}
|
4
|
+
{% block pm_archive_button %}{% endblock %}
|
5
|
+
{% block pm_undelete_button %}{% endblock %}
|
6
|
+
{% block pm_footer_info %}
|
7
|
+
<p class="alert alert-info">{% trans "Messages in this folder will never be removed. You can use this folder for long term storage." %}</p>
|
8
|
+
{% endblock %}
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{% extends "allauth/layouts/manage.html" %}
|
2
|
+
|
3
|
+
{% load i18n static postman_tags allauth %}
|
4
|
+
{% block head_title %}
|
5
|
+
{% trans "Messaging" %}
|
6
|
+
{% endblock head_title %}
|
7
|
+
|
8
|
+
{% block inner_content %}
|
9
|
+
{% block postman_menu %}{% with request.resolver_match.url_name as url_name %}
|
10
|
+
<ul id="postman_menu" class="nav nav-tabs">{% postman_unread as unread_count %}
|
11
|
+
<li class="nav-item"><a class="nav-link {% if url_name == 'inbox' %}active{% endif %}" href="{% url 'postman:inbox' %}">{% trans "Inbox" %}{% if unread_count %} <span class="badge text-bg-secondary">{{ unread_count }}</span>{% endif %}</a></li>
|
12
|
+
<li class="nav-item"><a class="nav-link {% if url_name == 'sent' %}active{% endif %}" href="{% url 'postman:sent' %}">{% trans "Sent Messages" %}</a></li>
|
13
|
+
<li class="nav-item"><a class="nav-link {% if url_name == 'write' or url_name == 'view_conversation' or url_name == 'reply' %}active{% endif %}" href="{% url 'postman:write' %}">{% trans "Write" %}</a></li>
|
14
|
+
<li class="nav-item"><a class="nav-link {% if url_name == 'archives' %}active{% endif %}" href="{% url 'postman:archives' %}">{% trans "Archives" %}</a></li>
|
15
|
+
<li class="nav-item"><a class="nav-link {% if url_name == 'trash' %}active{% endif %}" href="{% url 'postman:trash' %}">{% trans "Trash" %}</a></li>
|
16
|
+
</ul>
|
17
|
+
{% endwith %}{% endblock postman_menu %}
|
18
|
+
{% block content %}
|
19
|
+
{% endblock content %}
|
20
|
+
{% endblock inner_content %}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
{% extends "postman/base.html" %}
|
2
|
+
{% load i18n postman_tags allauth df_site pagination_tags django_bootstrap5 %}{% comment %}
|
3
|
+
WARNING: 'pagination_tags' is a name from the dj-pagination application.
|
4
|
+
For convenience, the design of this template is done with the use of that application.
|
5
|
+
Django-postman will still be working, even if that application is not installed, by providing a mock
|
6
|
+
for the template tag library.
|
7
|
+
If the real implementation is to be used, just make sure that 'dj_pagination' is declared before 'postman'
|
8
|
+
in the INSTALLED_APPS setting.
|
9
|
+
{% endcomment %}
|
10
|
+
{% block content %}
|
11
|
+
<div id="postman">
|
12
|
+
<h1 class="card-header text-center">{% block pm_folder_title %}{% endblock %}</h1>
|
13
|
+
|
14
|
+
{% if invalid_page %}
|
15
|
+
<p class="alert alert-danger">{% trans "Sorry, this page number is invalid." %}</p>
|
16
|
+
{% else %}
|
17
|
+
{% if pm_messages %}
|
18
|
+
{% block pm_by_modes %}<ul id="pm_byModes" class="nav justify-content-center">
|
19
|
+
<li class="pm_by-mode nav-item"><a class="nav-link{% if by_conversation %} active disabled{% else %}{% endif %}" href="{{ by_conversation_url }}">{% trans "by conversation" %}</a></li>
|
20
|
+
<li class="pm_by-mode nav-item"><a class="nav-link{% if by_message %} active disabled{% else %}{% endif %}" href="{{ by_message_url }}">{% trans "by message" %}</a></li>
|
21
|
+
</ul>
|
22
|
+
{% endblock pm_by_modes %}
|
23
|
+
<form class="card-body" action="{% block pm_form_action %}{% url 'postman:update-message' %}{% endblock %}" method="post">{% csrf_token %}
|
24
|
+
|
25
|
+
{% block pm_form_buttons %}<div id="pm_buttons" class="btn-group">
|
26
|
+
{% block pm_delete_button %}<button name="action" value="delete" type="submit" class="btn btn-sm btn-danger pm_btn pm_btn-delete" >{% trans "Delete" %}</button>{% endblock %}
|
27
|
+
{% block pm_archive_button %}<button name="action" value="archive" type="submit" class="btn btn-sm btn-primary pm_btn pm_btn-archive" >{% trans "Archive" %}</button>{% endblock %}
|
28
|
+
{% block pm_undelete_button %}<button name="action" value="undelete" type="submit" class="btn btn-sm btn-primary pm_btn pm_btn-undelete" >{% trans "Undelete" %}</button>{% endblock %}
|
29
|
+
{% block pm_read_button %}<button name="action" value="read" type="submit" class="btn btn-sm btn-primary pm_btn pm_btn-read" >{% trans "Mark as read" %}</button>{% endblock %}
|
30
|
+
{% block pm_unread_button %}<button name="action" value="unread" type="submit" class="btn btn-sm btn-primary pm_btn pm_btn-unread" >{% trans "Mark as unread" %}</button>{% endblock %}
|
31
|
+
</div>{% endblock %}
|
32
|
+
<table id="pm_messages" class="table table-striped table-hover">
|
33
|
+
<thead>
|
34
|
+
<tr>
|
35
|
+
<th>{% trans "Action" %}</th>
|
36
|
+
{% block pm_sender_header %} <th><a class="d-block nav-link" href="{% postman_order_by sender %}">{% trans "Sender" %} <span class="float-end">{% fa6_icon 'sort' %}</span></a></th>{% endblock %}
|
37
|
+
{% block pm_recipient_header %} <th><a class="d-block nav-link" href="{% postman_order_by recipient %}">{% trans "Recipient" %} <span class="float-end">{% fa6_icon 'sort' %}</span></a></th>{% endblock %}
|
38
|
+
<th><a class="d-block nav-link" href="{% postman_order_by subject %}">{% trans "Subject" %} <span class="float-end">{% fa6_icon 'sort' %}</span></a></th>
|
39
|
+
<th><a class="d-block nav-link" href="{% postman_order_by date %}">{% block pm_date %}{% trans "Date" %}{% endblock %} <span class="float-end">{% fa6_icon 'sort' %}</span></a></th>
|
40
|
+
</tr>
|
41
|
+
</thead>
|
42
|
+
{% paginate_qs pm_messages per_page=10 as pm_messages_p %}
|
43
|
+
<tbody>{% for message in pm_messages_p %}
|
44
|
+
<tr>
|
45
|
+
<td><input type="checkbox" {% if by_conversation and message.thread_id %}name="tpks" value="{{ message.thread_id }}"{% else %}name="pks" value="{{ message.pk }}"{% endif %}></td>
|
46
|
+
{% block pm_sender_cell %} <td>{{ message.obfuscated_sender|or_me:user }}{% if message.count %} ({{ message.count }}){% endif %}</td>{% endblock %}
|
47
|
+
{% block pm_recipient_cell %} <td>{{ message.obfuscated_recipient|or_me:user }}{% if message.count %} ({{ message.count }}){% endif %}</td>{% endblock %}
|
48
|
+
<td>{% if message.is_new %}<strong>{% endif %}{% if message.is_replied %}<em>{% endif %}
|
49
|
+
{% block pm_subject %}
|
50
|
+
<a href="{% if by_conversation and message.thread_id %}{% url 'postman:view_conversation' message.thread_id %}{% else %}{% url 'postman:view' message.pk %}{% endif %}?next={{ current_url|urlencode }}">
|
51
|
+
{% include "postman/inc_subject_ex.html" %}
|
52
|
+
</a>
|
53
|
+
{% if message.body %}<div class="text-body-tertiary">{{ message.body|truncatewords_html:7|safe }}</div>{% endif %}
|
54
|
+
{% endblock %}
|
55
|
+
{% if message.is_replied %}</em>{% endif %}{% if message.is_new %}</strong>{% endif %}</td>
|
56
|
+
<td>{{ message.sent_at|compact_date:_("g:i A,M j,n/j/y") }}</td>
|
57
|
+
</tr>{% endfor %}
|
58
|
+
</tbody>
|
59
|
+
</table>
|
60
|
+
{% bootstrap_pagination pm_messages_p size='sm' justify_content='center' %}
|
61
|
+
|
62
|
+
</form>
|
63
|
+
{% else %}
|
64
|
+
{% element p %}
|
65
|
+
{% trans "No messages." %}
|
66
|
+
{% endelement %}
|
67
|
+
{% endif %}
|
68
|
+
{% endif %}
|
69
|
+
{% block pm_footer_info %}{% endblock %}
|
70
|
+
</div>
|
71
|
+
{% endblock content %}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
{% extends "postman/base.html" %}
|
2
|
+
{% load i18n static django_bootstrap5 %}
|
3
|
+
{% block extrahead %}{{ block.super }}
|
4
|
+
{% if autocompleter_app.is_active %}{# using the available admin jQuery is enough #}
|
5
|
+
{# should not be necessary since AS v1.3 with AJAX_SELECT_BOOTSTRAP set #}
|
6
|
+
{#<script type="text/javascript" src="{% static 'admin/js/jquery.min.js' %}"></script>#}
|
7
|
+
{% endif %}
|
8
|
+
{{ form.media }}{# for ajax_selects (v1.3.6 at least) #}
|
9
|
+
{% endblock %}
|
10
|
+
{% block content %}
|
11
|
+
<div id="postman">
|
12
|
+
<h1 class="card-header text-center">{% block pm_write_title %}{% endblock %}</h1>
|
13
|
+
<div class="card-body">
|
14
|
+
<form action="{% if next_url %}?next={{ next_url|urlencode }}{% endif %}"
|
15
|
+
method="post">{% csrf_token %}
|
16
|
+
<table>
|
17
|
+
{% block pm_write_recipient %}{% endblock %}
|
18
|
+
</table>
|
19
|
+
{% bootstrap_form form layout='floating' %}
|
20
|
+
<div class="btn-group" role="group">
|
21
|
+
<button type="submit" class="pm_btn pm_btn-send btn btn-primary btn-sm">{% trans "Send" %}</button>
|
22
|
+
</div>
|
23
|
+
</form>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
{% endblock %}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
{% extends "postman/base_folder.html" %}
|
2
|
+
{% load i18n %}
|
3
|
+
{% block pm_folder_title %}{% trans "Received Messages" %}{% endblock %}
|
4
|
+
{% block pm_undelete_button %}{% endblock %}
|
5
|
+
{% block pm_recipient_header %}{% endblock %}
|
6
|
+
{% block pm_date %}{% trans "Received" %}{% endblock %}
|
7
|
+
{% block pm_recipient_cell %}{% endblock %}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{% comment %}
|
2
|
+
This file is intended to be included, such as in postman/base_folder.html:
|
3
|
+
{% include "postman/inc_subject_ex.html" %}
|
4
|
+
|
5
|
+
It provides an extended subject, as a replacement to a simple {{ message.subject }} tag.
|
6
|
+
Enhancements are:
|
7
|
+
* limit the subject length to a few words
|
8
|
+
* if there is still room up to a maximum number of words, then add the very first words of the body,
|
9
|
+
in a grey style.
|
10
|
+
|
11
|
+
Examples:
|
12
|
+
With a total of at most 12 words, and 5 words of subject.
|
13
|
+
With body: "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod."
|
14
|
+
|
15
|
+
With subject: "a subject of great interest for you":
|
16
|
+
"a subject of great interest ... - Lorem ipsum dolor sit amet, consectetur ..."
|
17
|
+
|
18
|
+
With subject: "a great interest":
|
19
|
+
"a great interest - Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed ..."
|
20
|
+
|
21
|
+
{% endcomment %}{% load postman_tags %}{% with message.subject|truncatewords_html:8 as truncated_subject %}{{ truncated_subject|safe }}{% endwith %}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
{% extends "postman/base_folder.html" %}
|
2
|
+
{% load i18n %}
|
3
|
+
{% block pm_folder_title %}{% trans "Deleted Messages" %}{% endblock %}
|
4
|
+
{% block pm_delete_button %}{% endblock %}
|
5
|
+
{% block pm_archive_button %}{% endblock %}
|
6
|
+
{% block pm_subject %}{# no link #}
|
7
|
+
{% include "postman/inc_subject_ex.html" %}
|
8
|
+
{% if message.body %}<div class="text-body-tertiary">{{ message.body|truncatewords:7|safe }}</div>{% endif %}
|
9
|
+
{% endblock %}
|
10
|
+
{% block pm_footer_info %}
|
11
|
+
<p class="alert alert-info">{% trans "Messages in this folder can be removed from time to time. For long term storage, use instead the archive folder." %}</p>
|
12
|
+
{% endblock %}
|
@@ -0,0 +1,64 @@
|
|
1
|
+
{% extends "postman/base.html" %}
|
2
|
+
{% load i18n %}{% load postman_tags df_site django_bootstrap5 %}
|
3
|
+
{% block content %}
|
4
|
+
<div id="postman">
|
5
|
+
<h1 class="card-header text-center">{% if pm_messages|length > 1 %}{% trans "Conversation" %}{% else %}{% trans "Message" %}{% endif %}</h1>
|
6
|
+
{% paginate_qs pm_messages per_page=10 as pm_messages_p %}
|
7
|
+
{% for message in pm_messages_p %}
|
8
|
+
<div
|
9
|
+
class="card m-2 pm_message {% if forloop.last %}text-body-emphasis {% else %}text-body-tertiary {% endif %}{% if message.is_pending %} pm_pending{% endif %}{% if message.is_rejected %} pm_rejected{% endif %}{% if message.sender == user and message.sender_archived or message.recipient == user and message.recipient_archived %} pm_archived{% endif %}{% if message.sender == user and message.sender_deleted_at or message.recipient == user and message.recipient_deleted_at %} pm_deleted{% endif %}{% if message.recipient == user and not message.read_at %} pm_unread{% endif %}">
|
10
|
+
<div class="pm_header card-header">
|
11
|
+
{% if message.sender == request.user %}{% fa6_icon 'sign-out-alt' %}{% else %}{% fa6_icon 'sign-in-alt' %}{% endif %}
|
12
|
+
<strong class="pm_subject">{{ message.subject|safe }}</strong>
|
13
|
+
{% if message.sender == request.user %} {% else %}
|
14
|
+
<small class="pm_sender">{{ message.obfuscated_sender|or_me:user }}</small>
|
15
|
+
{% endif %}
|
16
|
+
{% if message.sender == request.user %}<small class="pm_recipient">{{ message.obfuscated_recipient|or_me:user }}</small> {% else %}
|
17
|
+
|
18
|
+
{% endif %}
|
19
|
+
<small class="pm_date float-end ">{{ message.sent_at|date:"DATETIME_FORMAT" }}</small>
|
20
|
+
</div>
|
21
|
+
{% if message.is_rejected %}
|
22
|
+
<div class="pm_status alert alert-danger px-3 py-1 border-bottom"><strong>{% trans "Rejected" %}</strong>{% if message.moderation_reason %}{% trans ":" %}
|
23
|
+
{{ message.moderation_reason }}{% endif %}</div>
|
24
|
+
{% endif %}
|
25
|
+
<div class="card-body p-3 pm_body ">{{ message.body|safe }}</div>
|
26
|
+
</div>
|
27
|
+
{% if forloop.last %}
|
28
|
+
{% bootstrap_pagination pm_messages_p size='sm' justify_content='center' %}
|
29
|
+
<form class="card-body" method="post" action="
|
30
|
+
|
31
|
+
{% block pm_form_action %}{% url 'postman:update-message' %}?next={{ next_url|urlencode }}{% endblock %}">{% csrf_token %}
|
32
|
+
<input type="hidden" {% if pm_messages_p|length > 1 and message.thread_id %}name="tpks"
|
33
|
+
value="{{ message.thread_id }}" {% else %}name="pks" value="{{ message.pk }}"{% endif %}>
|
34
|
+
<div id="pm_buttons" class="btn-group">
|
35
|
+
<a href="{{ next_url }}"
|
36
|
+
class="pm_action pm_action-back btn btn-sm btn-primary">{% trans "Back" %}</a>
|
37
|
+
<button name="action" value="delete" type="submit"
|
38
|
+
class="pm_btn pm_btn-delete btn btn-sm btn-danger">{% trans "Delete" %}</button>
|
39
|
+
{% if not archived %}
|
40
|
+
<button name="action" value="archive" type="submit"
|
41
|
+
class="pm_btn pm_btn-archive btn btn-sm btn-info">{% trans "Archive" %}</button>{% endif %}
|
42
|
+
{% if reply_to_pk %}
|
43
|
+
<a href="{% url 'postman:reply' reply_to_pk %}?next={{ next_url|urlencode }}"
|
44
|
+
class="pm_action pm_action-reply btn btn-sm btn-primary">{% trans "Reply" %}</a>{% endif %}
|
45
|
+
</div>
|
46
|
+
</form>
|
47
|
+
|
48
|
+
{% if reply_to_pk %}
|
49
|
+
<h2 class="card-header border-top text-center">{% trans 'Reply' %}</h2>
|
50
|
+
<form class="card-body"
|
51
|
+
action="{% url 'postman:reply' reply_to_pk %}?next={{ next_url|urlencode }}"
|
52
|
+
method="post">{% csrf_token %}
|
53
|
+
<div id="pm_reply">{% bootstrap_form form layout='floating' %}</div>
|
54
|
+
|
55
|
+
<div class="btn-group">
|
56
|
+
<button type="submit"
|
57
|
+
class="pm_btn pm_btn-reply btn btn-sm btn-primary">{% trans 'Reply' %}</button>
|
58
|
+
</div>
|
59
|
+
</form>{% endif %}
|
60
|
+
{% endif %}
|
61
|
+
{% empty %}
|
62
|
+
{% endfor %}
|
63
|
+
</div>
|
64
|
+
{% endblock %}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
{% extends "allauth/layouts/manage.html" %}
|
2
|
+
|
3
|
+
{% load allauth i18n %}
|
4
|
+
{% block head_title %}
|
5
|
+
{% trans "Settings" %}
|
6
|
+
{% endblock head_title %}
|
7
|
+
{% block content %}
|
8
|
+
{% element h1 %}
|
9
|
+
{% trans "Settings" %}
|
10
|
+
{% endelement %}
|
11
|
+
{% url 'users:settings' as action_url %}
|
12
|
+
{% element form form=form method="post" action=action_url %}
|
13
|
+
{% slot body %}
|
14
|
+
{% csrf_token %}
|
15
|
+
{{ redirect_field }}
|
16
|
+
{% element fields form=form %}
|
17
|
+
{% endelement %}
|
18
|
+
{% endslot %}
|
19
|
+
{% slot actions %}
|
20
|
+
{% element button type="submit" %}
|
21
|
+
{% trans "Save" %}
|
22
|
+
{% endelement %}
|
23
|
+
{% endslot %}
|
24
|
+
{% endelement %}
|
25
|
+
{% endblock content %}
|
26
|
+
|