Skip to content

Commit

Permalink
Merge branch 'main' into feature/localize-time
Browse files Browse the repository at this point in the history
  • Loading branch information
dropforge authored Nov 21, 2023
2 parents 00f6c87 + f92f893 commit 8ed0216
Show file tree
Hide file tree
Showing 15 changed files with 117 additions and 181 deletions.
17 changes: 16 additions & 1 deletion myhpi/core/context.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.db.models import Q
from wagtail.core.models import Site

from .models import BasePage
from .models import BasePage, MinutesList
from .utils import get_user_groups


Expand Down Expand Up @@ -31,7 +31,22 @@ def base_context(request):
for page in pages_visible_for_user:
page_lookup[page.path] = pages_visible_for_user.child_of(page)

minutes_creation_links = {}
for group in request.user.groups.all():
minutes_creation_links[group.id] = create_minutes_for_group_link(request.user, group)

return {
"root_page": root_page,
"pages_by_parent": page_lookup,
"minutes_creation_links": minutes_creation_links,
}


def create_minutes_for_group_link(user, group):
minutes_list = MinutesList.objects.filter(group=group).first()
if not minutes_list:
return None
if minutes_list.permissions_for_user(user).can_add_subpage():
from django.urls import reverse

return reverse("wagtailadmin_pages:add_subpage", kwargs={"parent_page_id": minutes_list.id})
37 changes: 6 additions & 31 deletions myhpi/core/markdown/extensions.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
import re

import markdown
from django.core.exceptions import ObjectDoesNotExist
from django.utils.translation import gettext_lazy as _
from markdown import Extension
from markdown import Extension, util
from markdown.inlinepatterns import LinkInlineProcessor
from markdown.preprocessors import Preprocessor
from wagtail.core.models import Page
from wagtail.images.models import Image
from wagtail.models import Page


class MinutesBasePreprocessor(Preprocessor):
Expand Down Expand Up @@ -147,40 +145,22 @@ def decrease(self, match):

class InternalLinkPattern(LinkInlineProcessor):
def handleMatch(self, m, data=None):
el = markdown.util.etree.Element("a")
el = util.etree.Element("a")
try:
el.set("href", self.url(m.group("id")))
el.text = markdown.util.AtomicString(m.group("title"))
el.text = util.AtomicString(m.group("title"))
except ObjectDoesNotExist:
el.text = markdown.util.AtomicString(_("[missing link]"))
el.text = util.AtomicString(_("[missing link]"))
return el, m.start(0), m.end(0)

def url(self, id):
return Page.objects.get(id=id).localized.get_url()

@staticmethod
def default_pattern():
return r"\[(?P<title>[^\[]+)\]\(page:(?P<id>\d+)\)"


class ImagePattern(LinkInlineProcessor):
def handleMatch(self, m, data=None):
el = markdown.util.etree.Element("img")
try:
el.set("src", self.url(m.group("id")))
el.set("alt", markdown.util.AtomicString(m.group("title")))
el.set("class", "rendered-image")
except ObjectDoesNotExist:
el = markdown.util.etree.Element("span")
el.text = markdown.util.AtomicString(_("[missing image]"))
return el, m.start(0), m.end(0)

def url(self, id):
return Image.objects.get(id=id).get_rendition("width-800").url

def default_pattern():
return r"!\[(?P<title>[^\[]+)\]\(image:(?P<id>\d+)\)"


class MinuteExtension(Extension):
def extendMarkdown(self, md):
md.registerExtension(self)
Expand All @@ -195,8 +175,3 @@ def extendMarkdown(self, md):
"InternalLinkPattern",
200,
)
md.inlinePatterns.register(
ImagePattern(ImagePattern.default_pattern(), md),
"ImagePattern",
200,
)
6 changes: 3 additions & 3 deletions myhpi/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@
from modelcluster.contrib.taggit import ClusterTaggableManager
from modelcluster.fields import ParentalKey, ParentalManyToManyField
from taggit.models import ItemBase, TagBase
from wagtail.admin.edit_handlers import FieldPanel, PublishingPanel
from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.models import Page, Site
from wagtail.admin.panels import FieldPanel, PublishingPanel
from wagtail.documents.models import Document
from wagtail.models import Page, Site
from wagtail.search import index
from wagtail.snippets.models import register_snippet

Expand Down Expand Up @@ -195,7 +195,7 @@ class Minutes(BasePage):
FieldPanel("date"),
FieldPanel("moderator"),
FieldPanel("author"),
FieldPanel("participants", widget=UserSelectWidget),
FieldPanel("participants", widget=UserSelectWidget({"data-width": "100%"})),
FieldPanel("labels"),
FieldPanel("body"),
FieldPanel("guests"),
Expand Down
5 changes: 5 additions & 0 deletions myhpi/core/templatetags/core_extras.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,8 @@ def tag_external_links(content):
@register.filter(name="markdown")
def markdown(value):
return render_markdown(value)


@register.filter(name="get_link_for_group")
def get_link_for_group(minutes_creation_links, group):
return minutes_creation_links[group.id]
2 changes: 1 addition & 1 deletion myhpi/core/wagtail_hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
from django.db.models import Q
from django.templatetags.static import static
from django.utils.html import format_html
from wagtail import hooks
from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register
from wagtail.core import hooks

from myhpi.core.models import (
AbbreviationExplanation,
Expand Down
46 changes: 31 additions & 15 deletions myhpi/locale/de/LC_MESSAGES/django.po
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-08-09 16:50+0200\n"
"POT-Creation-Date: 2023-11-09 16:35+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <[email protected]>\n"
Expand All @@ -18,54 +18,60 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: core/markdown/extensions.py:54
#: core/markdown/extensions.py:55
msgid "Begin of meeting"
msgstr "Beginn des Meetings"

#: core/markdown/extensions.py:57
#: core/markdown/extensions.py:58
msgid "End of meeting"
msgstr "Ende des Meetings"

#: core/markdown/extensions.py:71
#: core/markdown/extensions.py:72
#, python-brace-format
msgid "*Meeting break: {time_start_break} – {time_end_break}*"
msgstr "*Sitzungspause: {time_start_break} – {time_end_break}*"

#: core/markdown/extensions.py:88
#: core/markdown/extensions.py:89
msgid "quorate"
msgstr "beschlussfähig"

#: core/markdown/extensions.py:88
#: core/markdown/extensions.py:89
msgid "not quorate"
msgstr "nicht beschlussfähig"

#: core/markdown/extensions.py:91
#: core/markdown/extensions.py:92
#, python-brace-format
msgid "*{num_participants}/{max_num_participants} present → {quorate}* "
msgstr "*{num_participants}/{max_num_participants} anwesend → {quorate}* "

#: core/markdown/extensions.py:115
#: core/markdown/extensions.py:116
#, python-brace-format
msgid "*{time}: {name} {event} the meeting* "
msgstr "*{time}: {name} {event} das Meeting* "

#: core/markdown/extensions.py:120
#: core/markdown/extensions.py:121
#, python-brace-format
msgid "*{time}: {name} {event} the meeting via {mean_of_participation}* "
msgstr "*{time}: {name} {event} das Meeting via {mean_of_participation}* "

#: core/markdown/extensions.py:130
#: core/markdown/extensions.py:131
msgid "enters"
msgstr "betritt"

#: core/markdown/extensions.py:133
#: core/markdown/extensions.py:134
msgid "leaves"
msgstr "verlässt"

#: core/markdown/extensions.py:154
#: core/markdown/extensions.py:155
msgid "[missing link]"
msgstr "[link fehlt]"

#: core/markdown/extensions.py:174
#, fuzzy
#| msgid "[missing link]"
msgid "[missing image]"
msgstr "[link fehlt]"

#: core/templates/core/information_page.html:19
msgid "Last edited"
msgstr "Zuletzt bearbeitet"
Expand Down Expand Up @@ -182,7 +188,7 @@ msgstr " Ergebnisse gefunden."
msgid "No results found."
msgstr "Keine Ergebnisse gefunden."

#: search/templates/search/search_field.html:6 templates/base.html:157
#: search/templates/search/search_field.html:6 templates/base.html:168
msgid "Search..."
msgstr "Suchen..."

Expand Down Expand Up @@ -249,14 +255,24 @@ msgstr "Anmelden"
msgid "Your groups:"
msgstr "Deine Gruppen"

#: templates/base.html:106
#: templates/base.html:108
#, fuzzy
#| msgid "Next minutes"
msgid "Create minutes"
msgstr "Protokoll erstellen"

#: templates/base.html:117
msgid "Sign out"
msgstr "Abmelden"

#: templates/base.html:159
#: templates/base.html:170
msgid "Start search"
msgstr "Suche starten"

#: templates/footer.html:14
msgid "Language"
msgstr "Sprache"

#: templates/login.html:11
msgid "Current user:"
msgstr "Aktueller User:"
Expand Down
4 changes: 2 additions & 2 deletions myhpi/polls/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from django.db.models import F, Sum
from django.shortcuts import redirect
from modelcluster.fields import ParentalKey
from wagtail.admin.edit_handlers import FieldPanel, InlinePanel
from wagtail.core.models import Orderable, Page
from wagtail.admin.panels import FieldPanel, InlinePanel
from wagtail.models import Orderable, Page
from wagtail.search import index

from myhpi.core.markdown.fields import CustomMarkdownField
Expand Down
2 changes: 1 addition & 1 deletion myhpi/search/views.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from django.db.models import Q
from django.template.response import TemplateResponse
from wagtail.core.models import Page
from wagtail.models import Page
from wagtail.search.models import Query

from myhpi.core.models import BasePage
Expand Down
4 changes: 2 additions & 2 deletions myhpi/static/js/admin/easymde_custom.js
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,8 @@ window.wagtailMarkdown.options = {
url: "/admin/images/chooser/",
onload: IMAGE_CHOOSER_MODAL_ONLOAD_HANDLERS,
responses: {
imageChosen: function (t) {
editor.codemirror.replaceSelection("![" + t.title + "](image:" + t.id + ")");
chosen: function (t) {
editor.codemirror.replaceSelection("![" + t.title + "](image:" + t.id + ",class=rendered-image,filter=width-800)");
}
},

Expand Down
6 changes: 6 additions & 0 deletions myhpi/static/scss/myHPI.scss
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,12 @@ h1.toc-title::after {
max-width: 100%;
}

.add-minutes {
display: flex;
align-items: flex-end;
flex-direction: column-reverse;
}

@import "./navbar.scss";
@import "./footer.scss";

Expand Down
13 changes: 12 additions & 1 deletion myhpi/templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,18 @@
<span class="nav-link pe-none"
id="navbar-groups-header"><i>{% translate "Your groups:" %}</i></span>
{% for group in user.groups.all %}
<li class="nav-link pe-none nav-link-extra-indent">{{ group }}</li>
<li class="nav-link nav-link-extra-indent">
<div class="row">
<div class="col">
{{ group }}
</div>
{% if minutes_creation_links|get_link_for_group:group%}
<div class="col add-minutes">
<a href="{{ minutes_creation_links|get_link_for_group:group }}" title="{% translate "Create minutes" %}"> {% bs_icon 'journal-plus' size='1.4em' %}</a>
</div>
{% endif %}
</div>
</li>
{% endfor %}
<li class="dropdown-divider"></li>
{% endif %}
Expand Down
30 changes: 0 additions & 30 deletions myhpi/tests/test_markdown_extensions.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
import re
from typing import Collection

import django
from django.test import TestCase
from django.utils.translation import activate
from wagtail.core.models import Page
from wagtail.images.models import Image

from myhpi.core.markdown.extensions import ImagePattern

django.setup()

Expand Down Expand Up @@ -103,28 +98,3 @@ def test_internal_link_preprocessor(self):
text = f"[Page title](page:{test_page.id})"
el, _, _ = ilp.handleMatch(re.match(ilp.pattern, text))
self.assertEqual(el.attrib["href"], test_page.localized.get_url())

def test_image_pattern(self):
activate("en")
from django.core.files.uploadedfile import SimpleUploadedFile

ip = ImagePattern(ImagePattern.default_pattern())

image_file = SimpleUploadedFile(
name="test_image.jpg",
content=open("myhpi/tests/files/test_image.jpg", "rb").read(),
content_type="image/jpeg",
)

image = Image.objects.create(
title="Test image",
file=image_file,
)

text = f"![Alt text](image:{image.id})"
invalid_text = "![Alt text](image:1234567890)"
el, _, _ = ip.handleMatch(re.match(ip.pattern, text))
self.assertEqual(el.attrib["src"], image.get_rendition("width-800").url)

el, _, _ = ip.handleMatch(re.match(ip.pattern, invalid_text))
self.assertEqual(el.text, "[missing image]")
2 changes: 1 addition & 1 deletion myhpi/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
from django.contrib.auth import views as auth_views
from django.urls import include, path, reverse_lazy
from django.views.generic import RedirectView
from wagtail import urls as wagtail_urls
from wagtail.admin import urls as wagtailadmin_urls
from wagtail.core import urls as wagtail_urls
from wagtail.documents import urls as wagtaildocs_urls

from myhpi.search import views as search_views
Expand Down
Loading

0 comments on commit 8ed0216

Please sign in to comment.