diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 4ed3a9935c5fe3f9afae84d6cb4f79068d05c95e..6d0424f22439b9ce695c2230c2bf5654cbb44841 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,7 +48,7 @@ repos: - name: Check for uncreated migrations. id: migrations-check language: system - entry: sh -c "src/manage.py makemigrations --check --dry-run" + entry: sh -c "pdm manage makemigrations --check --dry-run" files: "models/.*.py$" types: - python diff --git a/pdm.lock b/pdm.lock index 3f90458bbadf6301dba2b7baf3f11e234ea74402..5f6cc98c57936370f91c3de39f8a10fa1a4d236d 100644 --- a/pdm.lock +++ b/pdm.lock @@ -5,7 +5,7 @@ groups = ["default", "dev", "lint", "local", "static-analysis", "typing", "watchfiles"] strategy = ["inherit_metadata"] lock_version = "4.5.0" -content_hash = "sha256:6cd999df91d09b33edb8b107d34fb834eab68578ffd4ef259d54d373443858bd" +content_hash = "sha256:43da701dd7bbc3d2e5cc1f4f75912657fd1030067769f5ad070832b790edc0e8" [[metadata.targets]] requires_python = "==3.13.*" @@ -1359,31 +1359,23 @@ files = [ [[package]] name = "pillow" -version = "11.0.0" -requires_python = ">=3.9" +version = "10.4.0" +requires_python = ">=3.8" summary = "Python Imaging Library (Fork)" groups = ["default"] files = [ - {file = "pillow-11.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bcd1fb5bb7b07f64c15618c89efcc2cfa3e95f0e3bcdbaf4642509de1942a699"}, - {file = "pillow-11.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e038b0745997c7dcaae350d35859c9715c71e92ffb7e0f4a8e8a16732150f38"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ae08bd8ffc41aebf578c2af2f9d8749d91f448b3bfd41d7d9ff573d74f2a6b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d69bfd8ec3219ae71bcde1f942b728903cad25fafe3100ba2258b973bd2bc1b2"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:61b887f9ddba63ddf62fd02a3ba7add935d053b6dd7d58998c630e6dbade8527"}, - {file = "pillow-11.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:c6a660307ca9d4867caa8d9ca2c2658ab685de83792d1876274991adec7b93fa"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:73e3a0200cdda995c7e43dd47436c1548f87a30bb27fb871f352a22ab8dcf45f"}, - {file = "pillow-11.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fba162b8872d30fea8c52b258a542c5dfd7b235fb5cb352240c8d63b414013eb"}, - {file = "pillow-11.0.0-cp313-cp313-win32.whl", hash = "sha256:f1b82c27e89fffc6da125d5eb0ca6e68017faf5efc078128cfaa42cf5cb38798"}, - {file = "pillow-11.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:8ba470552b48e5835f1d23ecb936bb7f71d206f9dfeee64245f30c3270b994de"}, - {file = "pillow-11.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:846e193e103b41e984ac921b335df59195356ce3f71dcfd155aa79c603873b84"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4ad70c4214f67d7466bea6a08061eba35c01b1b89eaa098040a35272a8efb22b"}, - {file = "pillow-11.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:6ec0d5af64f2e3d64a165f490d96368bb5dea8b8f9ad04487f9ab60dc4bb6003"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c809a70e43c7977c4a42aefd62f0131823ebf7dd73556fa5d5950f5b354087e2"}, - {file = "pillow-11.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:4b60c9520f7207aaf2e1d94de026682fc227806c6e1f55bba7606d1c94dd623a"}, - {file = "pillow-11.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:1e2688958a840c822279fda0086fec1fdab2f95bf2b717b66871c4ad9859d7e8"}, - {file = "pillow-11.0.0-cp313-cp313t-win32.whl", hash = "sha256:607bbe123c74e272e381a8d1957083a9463401f7bd01287f50521ecb05a313f8"}, - {file = "pillow-11.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5c39ed17edea3bc69c743a8dd3e9853b7509625c2462532e62baa0732163a904"}, - {file = "pillow-11.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:75acbbeb05b86bc53cbe7b7e6fe00fbcf82ad7c684b3ad82e3d711da9ba287d3"}, - {file = "pillow-11.0.0.tar.gz", hash = "sha256:72bacbaf24ac003fea9bff9837d1eedb6088758d41e100c1552930151f677739"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, ] [[package]] diff --git a/pyproject.toml b/pyproject.toml index 6c9041f25fe7ea2e3164a768f37929a5f3c81497..93a8954906ba7a08d1cc6a5245f04758646f6610 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,7 +31,7 @@ dependencies = [ "openpyxl~=3.1.2", "ordered-set~=4.1.0", "pandas~=2.2.3", - "Pillow~=11.0", + "Pillow<11.0", "Pygments~=2.18", "pyjwt~=2.9.0", "requests-file>=2.0.0,<3", diff --git a/requirements.dev.txt b/requirements.dev.txt index 4160fd4e900fd563bad44286857c0d8bffd037a4..01eaab00841cce5de03882556471963eb6a9946a 100644 --- a/requirements.dev.txt +++ b/requirements.dev.txt @@ -87,7 +87,7 @@ pandas==2.2.3 pathspec==0.12.1 pbs-installer==2024.10.16 pdm==2.21.0 -pillow==11.0.0 +pillow==10.4.0 platformdirs==4.3.6 pluggy==1.5.0 pre-commit==4.0.1 diff --git a/requirements.txt b/requirements.txt index 9c1e18bd6c550b572878d3cd2d7a8e964709cb3d..5bc528d38184976c29cf9be7b66e006ab53e3c15 100644 --- a/requirements.txt +++ b/requirements.txt @@ -62,7 +62,7 @@ packaging==24.2 pandas==2.2.3 pbs-installer==2024.10.16 pdm==2.21.0 -pillow==11.0.0 +pillow==10.4.0 platformdirs==4.3.6 psycopg-binary==3.2.3; implementation_name != "pypy" psycopg-pool==3.2.4 diff --git a/src/api/schedule.py b/src/api/schedule.py index 0050b9e7ee3a6aecbed4333948fc514f1710324c..104128c13ea107f3e86b6d766b4b7e9985986c6c 100644 --- a/src/api/schedule.py +++ b/src/api/schedule.py @@ -162,7 +162,7 @@ class ScheduleEncoder(json.JSONEncoder): start = event.schedule_start.astimezone(tz or self.tz) if event.schedule_start is not None else None additional_data = event.additional_data or {} legacy_id = additional_data.get('id') or int(re.sub('[^0-9]+', '', str(event.id))[0:6]) - slug = f'{event.conference.slug}-{legacy_id}-{event.slug}' + slug = f'{event.conference.slug}-{event.slug}' if event.streaming == Event.Streaming.NO: additional_data['do_not_stream'] = True diff --git a/src/backoffice/forms/events.py b/src/backoffice/forms/events.py index 819ca7fd2f641e63dced69cd11987e383572380a..91695593dbc0f6c14389ee2cf3e4d7fa8edfbb7d 100644 --- a/src/backoffice/forms/events.py +++ b/src/backoffice/forms/events.py @@ -39,7 +39,7 @@ class EventForm(TranslatedFieldsForm): 'schedule_start': forms.DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%dT%H:%M:%S%z'), } - tags_list = forms.CharField(required=False, label=_('Tags'), help_text=_('Project__tags__help')) + tags_list = forms.CharField(required=False, label=_('Tags'), help_text=_('Event__tags__help')) def __init__( self, diff --git a/src/backoffice/locale/de/LC_MESSAGES/django.po b/src/backoffice/locale/de/LC_MESSAGES/django.po index 568af6a174a4db08804a702e820f64071c3ec595..64ffad6a43f9e5b08bab706bbede6dab43bbfa40 100644 --- a/src/backoffice/locale/de/LC_MESSAGES/django.po +++ b/src/backoffice/locale/de/LC_MESSAGES/django.po @@ -53,8 +53,8 @@ msgstr "Ende (YYYY-mm-dd HH:MM:SS)" msgid "Tags" msgstr "" -msgid "Project__tags__help" -msgstr "Unter diesen Tags wird das Project zu finden sein" +msgid "Event__tags__help" +msgstr "Unter diesen Tags wird die Veranstaltung zu finden sein" msgid "SoS" msgstr "Self-organized Session" diff --git a/src/backoffice/locale/en/LC_MESSAGES/django.po b/src/backoffice/locale/en/LC_MESSAGES/django.po index c23341ef5f5eb961e4d17aef1b6eb963ce41b51c..b04ff9a200019d4cbaf213b25ae1f6242969f6bb 100644 --- a/src/backoffice/locale/en/LC_MESSAGES/django.po +++ b/src/backoffice/locale/en/LC_MESSAGES/django.po @@ -53,8 +53,8 @@ msgstr "end (YYYY-mm-dd HH:MM:SS)" msgid "Tags" msgstr "" -msgid "Project__tags__help" -msgstr "The project will be found under these tags" +msgid "Event__tags__help" +msgstr "The event will be found under these tags" msgid "SoS" msgstr "Self-Organized Session" diff --git a/src/backoffice/templates/backoffice/schedule_source-detail.html b/src/backoffice/templates/backoffice/schedule_source-detail.html index 474b7c5d2d95350895583f87b5992ab3be16f9e3..2122ae2de9557aecdc34277179b406c8cf5f687d 100644 --- a/src/backoffice/templates/backoffice/schedule_source-detail.html +++ b/src/backoffice/templates/backoffice/schedule_source-detail.html @@ -40,7 +40,7 @@ <p> Configuration: <br> - <pre class="border"><code>{{ object.import_configuration_masked }}</code></pre> + <pre class="border"><code>{{ object.import_configuration_masked|json_indent }}</code></pre> </p> </div> </div> diff --git a/src/backoffice/templates/backoffice/schedule_source_import-detail.html b/src/backoffice/templates/backoffice/schedule_source_import-detail.html index 2e16e127146defc51d12375da6fe432f18434431..8b7e2c2597d29b28450036f892667917660171ba 100644 --- a/src/backoffice/templates/backoffice/schedule_source_import-detail.html +++ b/src/backoffice/templates/backoffice/schedule_source_import-detail.html @@ -4,6 +4,13 @@ {% block content %} + {% if object.data %} + <div class="float-end"> + <a href="{% url 'backoffice:schedulesourceimport-detail-data' pk=object.pk %}" + class="btn btn-outline-primary">data as JSON</a> + </div> + {% endif %} + <h1> ScheduleSourceImport for "<span title="{{ object.schedule_source.assembly.name }}">{{ object.schedule_source.assembly.slug }}</span>" </h1> @@ -14,6 +21,9 @@ Source <a href="{% url 'backoffice:schedulesource-detail' pk=object.schedule_source_id %}"><code>{{ object.schedule_source_id }}</code></a> </div> <div class="card-body"> + <p> + URL: <strong><a href="{{ object.schedule_source.import_url }}">{{ object.schedule_source.import_url }}</a></strong> + </p> <p> State: <strong class="{{ object.text_color_class }}">{{ object.state }}</strong> </p> @@ -95,11 +105,4 @@ </div> {% endif %} - {% if object.data %} - <div class="text-center"> - <a href="{% url 'backoffice:schedulesourceimport-detail-data' pk=object.pk %}" - class="btn btn-outline-primary">data as JSON</a> - </div> - {% endif %} - {% endblock content %} diff --git a/src/backoffice/templates/backoffice/sos_create_edit.html b/src/backoffice/templates/backoffice/sos_create_edit.html index 36ae74b410bad1965662b452afbc46122a2214fa..ffaf7806ea2f0f62b801233a9b5a498d70f29d87 100644 --- a/src/backoffice/templates/backoffice/sos_create_edit.html +++ b/src/backoffice/templates/backoffice/sos_create_edit.html @@ -107,7 +107,7 @@ <span>{% trans "Event_publication_errors" %}</span> <ul> {% for field, error in publication_errors.items %} - {% with "SoS__"|add:field as field_name %} + {% with "Event__"|add:field as field_name %} <li>{% trans field_name %}: {{ error.0 }}</li> {% endwith %} {% endfor %} diff --git a/src/core/models/rooms.py b/src/core/models/rooms.py index 0ab54546ad3e23d311cb367d608c2e13e593236d..d33ff8ce7b9e8fda72e33508023753e3cf9c549a 100644 --- a/src/core/models/rooms.py +++ b/src/core/models/rooms.py @@ -350,7 +350,7 @@ class Room(BackendMixin, models.Model): if fld in data: value = data[fld] if not pop_used_keys else data.pop(fld) if fld in integer_fields: - value = int(value) + value = int(value) if value else None elif fld in bool_fields: value = str2bool(value) setattr(obj, fld, value) diff --git a/src/core/models/schedules.py b/src/core/models/schedules.py index 3e394cb9cfd7e64251ac33efe66eb9f6cef601fa..aed616a497c2659faa6e4b1bf292f6dd723c06bc 100644 --- a/src/core/models/schedules.py +++ b/src/core/models/schedules.py @@ -348,8 +348,6 @@ class ScheduleSource(models.Model): ) logging.exception('Import on ScheduleSource %s encountered exception on creating mapping for %s "%s".', self.pk, item_type, item_source_id) - # ... and delete the incomplete (wrong) mapping - mapping.delete() return 'error' else: @@ -473,6 +471,7 @@ class ScheduleSource(models.Model): """ # for the source id use the provided id, uuid or guid field (in order) + # TODO move id to end speaker_id = speaker_info.get('id') or speaker_info.get('uuid') or speaker_info.get('guid') # sanity check: verify that required attributes are present diff --git a/src/core/schedules/schedulejson.py b/src/core/schedules/schedulejson.py index 389339c347ea16f9b72c3f079acafc3fbe50da20..63063eae8895a1a935b19114ba8aca7f75a7259f 100644 --- a/src/core/schedules/schedulejson.py +++ b/src/core/schedules/schedulejson.py @@ -15,10 +15,15 @@ class ScheduleJSONSupport(BaseScheduleSupport): identifier = 'schedule-json' readonly = True + # fmt: off configuration_fields = { - 'feedback': ('bool', True, False, 'Enable/Disable feedback url generation'), - 'kind': ('string', 'assembly', False, 'kind of events, either "assembly" or "official" or "sos" or "lightning"'), + # 'key': (type, default value, mandatory, translation text) + 'feedback': ('bool', True, False, 'Enable/Disable feedback url generation'), + 'kind': ('string', 'assembly', False, 'kind of events, either `assembly` or `official` or `sos` or `lightning`'), + 'headers': ('dict', {}, False, 'HTTP headers to send with the request e.g. Authorization'), + 'auth': ('string', None, False, 'HTTP Authentification header e.g. `Token 123456`'), } + # fmt: on def ready(self): r = s.head(self.remote_url) @@ -38,9 +43,14 @@ class ScheduleJSONSupport(BaseScheduleSupport): all events need to have an unique but stable identifier, i.e. if the name of the event changes the identifier must not change! """ - - schedule = ScheduleJSON.from_url(self.remote_url, language='en') - schedule_de = ScheduleJSON.from_url(self.remote_url, language='de', event_map=True) + headers = {} + if self.conf_value('headers'): + headers = self.conf_value('headers') + if self.conf_value('auth'): + headers['Authorization'] = self.conf_value('auth') + + schedule = ScheduleJSON.from_url(self.remote_url, headers={**headers, 'Accept-Language': 'en'}) + schedule_de = ScheduleJSON.from_url(self.remote_url, headers={**headers, 'Accept-Language': 'de'}, event_map=True) instance = urlparse(schedule.get('base_url', self.remote_url)) host = f'//{instance.netloc}' @@ -101,8 +111,8 @@ class ScheduleJSON: self._events = {e.get('guid'): e for e in self.events()} @classmethod - def from_url(cls, url, client=None, language=None, event_map=False): - r = (client if client else s).get(url, headers={'Accept-Language': language} if language else None) + def from_url(cls, url, client=None, headers=None, event_map=False): + r = (client if client else s).get(url, headers=headers) if r.ok is False: raise Exception(f'Request failed, HTTP {r.status_code}.') diff --git a/src/core/schedules/schedulejsonfrab.py b/src/core/schedules/schedulejsonfrab.py index 5af35f9cc06edd54b62fa52197ab9b63d657424e..642daea7faf829aef31013e203a92f204d39d08c 100644 --- a/src/core/schedules/schedulejsonfrab.py +++ b/src/core/schedules/schedulejsonfrab.py @@ -19,13 +19,15 @@ class ScheduleJSONFrabSupport(ScheduleJSONSupport): identifier = 'schedule-json-frab' readonly = True + # fmt: off configuration_fields = { - 'feedback': ('bool', True, False, 'Enable/Disable feedback url generation'), - 'kind': ('string', 'assembly', False, 'kind of events, either "assembly" or "official" or "sos" or "lightning"'), + 'feedback': ('bool', True, False, 'Enable/Disable feedback url generation'), + 'kind': ('string', 'assembly', False, 'kind of events, either "assembly" or "official" or "sos" or "lightning"'), 'images_base_url': (['bool', 'str'], False, False, 'Use image urls from origin instead of hub'), - 'host': ('string', 'https://frab.cccv.de/', False, 'overwrite Base URL of the schedule, used for feedback page, images, etc.'), - 'auth': ('string', None, False, 'login data for frab instance, format: user:password'), + 'host': ('string', 'https://frab.cccv.de/', False, 'overwrite Base URL of the schedule, used for feedback page, images, etc.'), + 'auth': ('string', None, False, 'login data for frab instance, format: user:password'), } + # fmt: on origin_base_url = None diff --git a/src/core/utils.py b/src/core/utils.py index a39e515cbdd1f0560c81d6e65c6943f7c8adecf4..c084a7b45eec011da92cf4228d05c4c86e7714fe 100644 --- a/src/core/utils.py +++ b/src/core/utils.py @@ -6,13 +6,13 @@ import subprocess import tempfile import uuid from datetime import UTC, datetime, timedelta -from io import BytesIO from pathlib import Path from string import ascii_letters, digits from urllib.parse import parse_qs, urlparse, urlunparse import requests +from django.core.files.base import ContentFile from django.urls import NoReverseMatch from django.utils.functional import cached_property from django.utils.html import strip_tags @@ -217,7 +217,7 @@ def download_from_url(url: str) -> tuple[str, bytes]: # read the binary content r.raw.decode_content = True - data = BytesIO(r.content) + data = ContentFile(r.content) # return the result return filename, data diff --git a/src/plainui/jinja2/plainui/event.html.j2 b/src/plainui/jinja2/plainui/event.html.j2 index 2730a046532c209522bcd0b880b56a57dbd1ad49..b47091dc2dd93369bea23a0815cc51c24442a090 100644 --- a/src/plainui/jinja2/plainui/event.html.j2 +++ b/src/plainui/jinja2/plainui/event.html.j2 @@ -134,6 +134,7 @@ <a href=" {{ event.additional_data.get("feedback_url") }}" class="btn btn-primary" target="_blank"> + title="{{ _('Click here to let us know how you liked this event') }}" <i class="bi bi-hand-thumbs-up"></i> <i class="bi bi-hand-thumbs-down"></i> {{ _("Rate event") }} diff --git a/src/plainui/locale/de/LC_MESSAGES/django.po b/src/plainui/locale/de/LC_MESSAGES/django.po index f63908995f5d51b9b5b66362fdac24971578f78f..1c39633ed7a997d8c7c43904e7edd6f7fbe6e52b 100644 --- a/src/plainui/locale/de/LC_MESSAGES/django.po +++ b/src/plainui/locale/de/LC_MESSAGES/django.po @@ -427,6 +427,9 @@ msgstr "Zurück" msgid "Follow Link" msgstr "Link folgen" +msgid "Click here to let us know how you liked this event" +msgstr "Klicke hier, um uns mitzuteilen, wie dir diese Veranstaltung gefallen hat" + msgid "Rate event" msgstr "Event bewerten" diff --git a/src/plainui/locale/en/LC_MESSAGES/django.po b/src/plainui/locale/en/LC_MESSAGES/django.po index d942c5544b2711cb50e524b05f7271ae611af523..59458723b50e9a01f58a51acd62079b794ce3bd1 100644 --- a/src/plainui/locale/en/LC_MESSAGES/django.po +++ b/src/plainui/locale/en/LC_MESSAGES/django.po @@ -427,6 +427,9 @@ msgstr "" msgid "Follow Link" msgstr "Follow Link" +msgid "Click here to let us know how you liked this event" +msgstr "" + msgid "Rate event" msgstr "Rate event" @@ -1053,7 +1056,7 @@ msgstr "" #, python-format msgid "Tag %(name)s" -msgstr "Day %(name)s" +msgstr "Tag %(name)s" #, python-format msgid "Conference %(conf)s - Password Reset"