From ec6270dd3e550a4c13402944ab4923f472b5e7e4 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 17 Apr 2023 20:54:36 +0200 Subject: [PATCH 01/29] graphql: Some initial work --- amelie/graphql/__init__.py | 0 amelie/graphql/admin.py | 3 + amelie/graphql/apps.py | 6 + amelie/graphql/auth.py | 31 +++++ amelie/graphql/decorators.py | 26 ++++ amelie/graphql/filters.py | 5 + amelie/graphql/jwt_handlers.py | 17 +++ amelie/graphql/migrations/__init__.py | 0 amelie/graphql/models.py | 3 + amelie/graphql/pagination/__init__.py | 0 amelie/graphql/pagination/connection.py | 49 +++++++ amelie/graphql/pagination/connection_field.py | 127 ++++++++++++++++++ amelie/graphql/pagination/objects_type.py | 15 +++ amelie/graphql/schema.py | 44 ++++++ amelie/graphql/tests.py | 3 + amelie/graphql/urls.py | 11 ++ amelie/graphql/views.py | 8 ++ amelie/members/graphql.py | 20 +++ amelie/members/graphql_types.py | 109 +++++++++++++++ amelie/news/graphql.py | 27 ++++ amelie/settings/generic.py | 46 ++++++- amelie/tools/auth.py | 25 +--- amelie/tools/user.py | 33 +++++ amelie/urls.py | 3 + requirements.txt | 6 + 25 files changed, 592 insertions(+), 25 deletions(-) create mode 100644 amelie/graphql/__init__.py create mode 100644 amelie/graphql/admin.py create mode 100644 amelie/graphql/apps.py create mode 100644 amelie/graphql/auth.py create mode 100644 amelie/graphql/decorators.py create mode 100644 amelie/graphql/filters.py create mode 100644 amelie/graphql/jwt_handlers.py create mode 100644 amelie/graphql/migrations/__init__.py create mode 100644 amelie/graphql/models.py create mode 100644 amelie/graphql/pagination/__init__.py create mode 100644 amelie/graphql/pagination/connection.py create mode 100644 amelie/graphql/pagination/connection_field.py create mode 100644 amelie/graphql/pagination/objects_type.py create mode 100644 amelie/graphql/schema.py create mode 100644 amelie/graphql/tests.py create mode 100644 amelie/graphql/urls.py create mode 100644 amelie/graphql/views.py create mode 100644 amelie/members/graphql.py create mode 100644 amelie/members/graphql_types.py create mode 100644 amelie/news/graphql.py create mode 100644 amelie/tools/user.py diff --git a/amelie/graphql/__init__.py b/amelie/graphql/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amelie/graphql/admin.py b/amelie/graphql/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/amelie/graphql/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/amelie/graphql/apps.py b/amelie/graphql/apps.py new file mode 100644 index 0000000..a68e545 --- /dev/null +++ b/amelie/graphql/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class GraphqlConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'amelie.graphql' diff --git a/amelie/graphql/auth.py b/amelie/graphql/auth.py new file mode 100644 index 0000000..2752451 --- /dev/null +++ b/amelie/graphql/auth.py @@ -0,0 +1,31 @@ +import graphql_jwt +from django.contrib.auth import get_user_model + +import graphene +from graphene_django import DjangoObjectType + + +class UserType(DjangoObjectType): + class Meta: + model = get_user_model() + description = "Type definition for a single User" + exclude = ("password", ) + + +class AuthenticationQuery(graphene.ObjectType): + me = graphene.Field( + UserType, + description="Information about the currently logged in user" + ) + + def resolve_me(self, info): + user = info.context.user + if user.is_anonymous: + return None + return user + + +class AuthenticationMutation(graphene.ObjectType): + verify_token = graphql_jwt.Verify.Field( + description="Check if an authentication token is valid" + ) diff --git a/amelie/graphql/decorators.py b/amelie/graphql/decorators.py new file mode 100644 index 0000000..7b45cd0 --- /dev/null +++ b/amelie/graphql/decorators.py @@ -0,0 +1,26 @@ +from graphql import GraphQLError + + +def _get_attribute(obj, dotted_path): + value = obj + for key in dotted_path.split('.'): + if isinstance(value, list): + value = value[int(key)] + elif isinstance(value, dict): + value = value[key] + else: + value = getattr(value, key) + return value + + +def allow_only_self_or_board(identity): + def wrapper_allow_only_self_or_board(func): + def wrapper_args_allow_only_self_or_board(self, info, *args, **kwargs): + user = info.context.user + is_board = hasattr(user, 'person') and hasattr(user.person, 'is_board') and user.person.is_board + is_superuser = hasattr(user, 'is_superuser') and user.is_superuser + if not is_board and not is_superuser and _get_attribute(info, identity) != self.id: + raise GraphQLError("Access denied.") + return func(self, info, *args, **kwargs) + return wrapper_args_allow_only_self_or_board + return wrapper_allow_only_self_or_board diff --git a/amelie/graphql/filters.py b/amelie/graphql/filters.py new file mode 100644 index 0000000..943087c --- /dev/null +++ b/amelie/graphql/filters.py @@ -0,0 +1,5 @@ +import django_filters + + +class NumberInFilter(django_filters.BaseInFilter, django_filters.NumberFilter): + pass diff --git a/amelie/graphql/jwt_handlers.py b/amelie/graphql/jwt_handlers.py new file mode 100644 index 0000000..64fdc6b --- /dev/null +++ b/amelie/graphql/jwt_handlers.py @@ -0,0 +1,17 @@ +from amelie.tools.user import get_user_by_username + + +def allow_none(info, **kwargs): + return False + + +def get_username_from_jwt_payload(payload): + username = payload.get('preferred_username', None) + if username is None: + from graphql_jwt.exceptions import JSONWebTokenError + raise JSONWebTokenError("Invalid payload") + return username + + +def get_user_from_jwt_username(username): + return get_user_by_username(username) diff --git a/amelie/graphql/migrations/__init__.py b/amelie/graphql/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amelie/graphql/models.py b/amelie/graphql/models.py new file mode 100644 index 0000000..71a8362 --- /dev/null +++ b/amelie/graphql/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/amelie/graphql/pagination/__init__.py b/amelie/graphql/pagination/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/amelie/graphql/pagination/connection.py b/amelie/graphql/pagination/connection.py new file mode 100644 index 0000000..ac760b3 --- /dev/null +++ b/amelie/graphql/pagination/connection.py @@ -0,0 +1,49 @@ +import re + +from collections import OrderedDict + +from graphene import Connection, List, NonNull, Field +from graphene.relay.connection import ConnectionOptions + +from amelie.graphql.pagination.objects_type import PageInfoExtra + + +# Source: https://github.com/instruct-br/graphene-django-pagination +class PaginationConnection(Connection): + class Meta: + abstract = True + + @classmethod + def __init_subclass_with_meta__(cls, node=None, name=None, **options): + _meta = ConnectionOptions(cls) + base_name = re.sub("Connection$", "", name or cls.__name__) or node._meta.name # noqa + + if not name: + name = "{}Connection".format(base_name) + + options["name"] = name + _meta.node = node + _meta.fields = OrderedDict( + [ + ( + "page_info", + Field( + PageInfoExtra, + name="pageInfo", + required=True, + description="Pagination data for this connection.", + ), + ), + ( + "results", + Field( + NonNull(List(node)), + description="Contains the nodes in this connection.", + ), + ), + ] + ) + + return super(Connection, cls).__init_subclass_with_meta__( + _meta=_meta, **options + ) diff --git a/amelie/graphql/pagination/connection_field.py b/amelie/graphql/pagination/connection_field.py new file mode 100644 index 0000000..452a589 --- /dev/null +++ b/amelie/graphql/pagination/connection_field.py @@ -0,0 +1,127 @@ +import re +import math + +from django.core.paginator import Paginator +from django.conf import settings + +from graphene import Int, String +from graphene_django.filter import DjangoFilterConnectionField +from graphene_django.utils import maybe_queryset + +from amelie.graphql.pagination.connection import PaginationConnection +from amelie.graphql.pagination.objects_type import PageInfoExtra + + +# Source: https://github.com/instruct-br/graphene-django-pagination +class DjangoPaginationConnectionField(DjangoFilterConnectionField): + def __init__( + self, + type, + fields=None, + order_by=None, + extra_filter_meta=None, + filterset_class=None, + *args, + **kwargs + ): + self._type = type + self._fields = fields + self._provided_filterset_class = filterset_class + self._filterset_class = None + self._extra_filter_meta = extra_filter_meta + self._base_args = None + + kwargs.setdefault("limit", Int(settings.GRAPHENE_DEFAULT_LIMIT, description="Query limit")) + kwargs.setdefault("offset", Int(description="Query offset")) + kwargs.setdefault("ordering", String(description="Query order")) + + super(DjangoPaginationConnectionField, self).__init__( + type, + *args, + **kwargs + ) + + @property + def type(self): + + class NodeConnection(PaginationConnection): + total_count = Int() + + class Meta: + node = self._type + name = '{}NodeConnection'.format(self._type._meta.name) + + def resolve_total_count(self, info, **kwargs): + return self.iterable.count() + + return NodeConnection + + @classmethod + def resolve_connection(cls, connection, arguments, iterable, max_limit=None): + iterable = maybe_queryset(iterable) + + _len = len(iterable) + + ordering = arguments.get("ordering") + + if ordering: + iterable = connection_from_list_ordering(iterable, ordering) + + connection = connection_from_list_slice( + iterable, + arguments, + connection_type=connection, + pageinfo_type=PageInfoExtra, + ) + connection.iterable = iterable + connection.length = _len + + return connection + + +def connection_from_list_slice( + list_slice, args=None, connection_type=None, pageinfo_type=None +): + args = args or {} + limit = args.get("limit", None) + offset = args.get("offset", 0) + + if limit is None: + return connection_type( + results=list_slice, + page_info=pageinfo_type( + has_previous_page=False, + has_next_page=False + ) + ) + else: + assert isinstance(limit, int), "Limit must be of type int" + assert limit > 0, "Limit must be positive integer greater than 0" + + paginator = Paginator(list_slice, limit) + _slice = list_slice[offset:(offset+limit)] + + page_num = math.ceil(offset/limit) + 1 + page_num = ( + paginator.num_pages + if page_num > paginator.num_pages + else page_num + ) + page = paginator.page(page_num) + + return connection_type( + results=_slice, + page_info=pageinfo_type( + has_previous_page=page.has_previous(), + has_next_page=page.has_next() + ) + ) + + +def connection_from_list_ordering(items_list, ordering): + field, order = ordering.split(',') + + order = '-' if order == 'desc' else '' + field = re.sub(r'(?=0.3.11,<0.4 # 1.x has breaking changes (old firebase api removed) # Custom forks or specific commits of django packages git+https://github.com/Inter-Actief/django-sslserver@204586ce686212a4c2848c12f88f7279802b5dcc +# GraphQL API +graphene-django +django-graphql-jwt +django-filter +graphene-django-extras + # Other random dependencies, to be documented, see issue #556 ... beautifulsoup4>=4.11.1,<4.12 bleach>=5.0.1,<5.1 From 96eed3ecd177765c8e579c8d508e944cc72497cf Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 17 Apr 2023 22:52:22 +0200 Subject: [PATCH 02/29] graphql: Add all public models to GraphQL for the members module --- amelie/members/graphql.py | 30 +++++++- amelie/members/graphql_types.py | 120 +++++++++++++++++++++++++++++++- 2 files changed, 148 insertions(+), 2 deletions(-) diff --git a/amelie/members/graphql.py b/amelie/members/graphql.py index 22388f8..f5b69c2 100644 --- a/amelie/members/graphql.py +++ b/amelie/members/graphql.py @@ -1,16 +1,44 @@ import graphene from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField -from amelie.members.graphql_types import PersonType, CommitteeType +from amelie.members.graphql_types import PersonType, CommitteeType, FunctionType, DogroupType, DogroupGenerationType, \ + AssociationType, StudentType, StudyPeriodType, EmployeeType, PhotographerType, CommitteeCategoryType class MembersQuery(graphene.ObjectType): + dogroup = graphene.Field(DogroupType, id=graphene.ID()) + dogroups = DjangoPaginationConnectionField(DogroupType) + + dogroupGeneration = graphene.Field(DogroupGenerationType, id=graphene.ID()) + dogroupGenerations = DjangoPaginationConnectionField(DogroupGenerationType) + + association = graphene.Field(AssociationType, id=graphene.ID()) + associations = DjangoPaginationConnectionField(AssociationType) + person = graphene.Field(PersonType, id=graphene.ID()) persons = DjangoPaginationConnectionField(PersonType) + student = graphene.Field(StudentType, id=graphene.ID()) + students = DjangoPaginationConnectionField(StudentType) + + studyPeriod = graphene.Field(StudyPeriodType, id=graphene.ID()) + studyPeriods = DjangoPaginationConnectionField(StudyPeriodType) + + employee = graphene.Field(EmployeeType, id=graphene.ID()) + employees = DjangoPaginationConnectionField(EmployeeType) + + photographer = graphene.Field(PhotographerType, id=graphene.ID()) + photographers = DjangoPaginationConnectionField(PhotographerType) + + committeeCategory = graphene.Field(CommitteeCategoryType, id=graphene.ID()) + committeeCategories = DjangoPaginationConnectionField(CommitteeCategoryType) + committee = graphene.Field(CommitteeType, id=graphene.ID()) committees = DjangoPaginationConnectionField(CommitteeType) + function = graphene.Field(FunctionType, id=graphene.ID()) + functions = DjangoPaginationConnectionField(FunctionType) + def resolve_person(root, *args, **kwargs): return PersonType.get_object(root, *args, **kwargs) diff --git a/amelie/members/graphql_types.py b/amelie/members/graphql_types.py index 62ebe4a..5c7b8fb 100644 --- a/amelie/members/graphql_types.py +++ b/amelie/members/graphql_types.py @@ -5,7 +5,47 @@ import amelie.graphql.filters as custom_filters from amelie.graphql.decorators import allow_only_self_or_board -from amelie.members.models import Person, Committee +from amelie.members.models import Person, Committee, Function, Dogroup, DogroupGeneration, Association, Student, \ + StudyPeriod, Employee, Photographer, CommitteeCategory + + +class DogroupFilterSet(FilterSet): + class Meta: + Model = Dogroup + fields = ["name"] + + +class DogroupType(DjangoObjectType): + class Meta: + model = Dogroup + description = "Type definition for a single Dogroup" + filterset_class = DogroupFilterSet + + +class DogroupGenerationFilterSet(FilterSet): + class Meta: + model = DogroupGeneration + fields = ["generation", "dogroup", "parents", "study", "mail_alias"] + + +class DogroupGenerationType(DjangoObjectType): + class Meta: + model = DogroupGeneration + description = "Type definition for a single DogroupGeneration" + filterset_class = DogroupGenerationFilterSet + + +class AssociationFilterSet(FilterSet): + class Meta: + model = Association + fields = ["name", "studies"] + + +class AssociationType(DjangoObjectType): + class Meta: + model = Association + description = "Type defintion for a single Association" + filterset_class = AssociationFilterSet class PersonFilterSet(FilterSet): @@ -96,6 +136,71 @@ def resolve_telephone(self, info): return self.telephone +class StudentFilterSet(FilterSet): + class Meta: + model = Student + fields = ["person", "number"] + + +class StudentType(DjangoObjectType): + class Meta: + model = Student + description = "Type definition for a single Student" + filterset_class = StudentFilterSet + + +class StudyPeriodFilterSet(FilterSet): + class Meta: + model = StudyPeriod + fields = ["student", "study", "begin", "end", "graduated", "dogroup"] + + +class StudyPeriodType(DjangoObjectType): + class Meta: + model = StudyPeriod + description = "Type definition for a single StudyPeriod" + filterset_class = StudyPeriodFilterSet + + +class EmployeeFilterSet(FilterSet): + class Meta: + model = Employee + fields = ["person", "number", "end"] + + +class EmployeeType(DjangoObjectType): + class Meta: + model = Employee + description = "Type definition for a single Employee" + filterset_class = EmployeeFilterSet + + +class PhotographerFilterSet(FilterSet): + class Meta: + model = Photographer + fields = ["first_name", "last_name_prefix", "last_name", "person"] + + +class PhotographerType(DjangoObjectType): + class Meta: + model = Photographer + description = "Type definition for a single Photographer" + filterset_class = PhotographerFilterSet + + +class CommitteeCategoryFilterSet(FilterSet): + class Meta: + model = CommitteeCategory + fields = ["name", "slug"] + + +class CommitteeCategoryType(DjangoObjectType): + class Meta: + model = CommitteeCategory + description = "Type definition for a single CommitteeCategory" + filterset_class = CommitteeCategoryFilterSet + + class CommitteeFilterSet(FilterSet): class Meta: model = Committee @@ -107,3 +212,16 @@ class Meta: model = Committee description = "Type definition for a single Committee" filterset_class = CommitteeFilterSet + + +class FunctionFilterSet(FilterSet): + class Meta: + model = Function + fields = ["person", "committee", "function", "note", "begin", "end"] + + +class FunctionType(DjangoObjectType): + class Meta: + model = Function + description = "Type definition for a single Function" + filterset_class = FunctionFilterSet From 36ebbae1a6e4f1c045a9d9080b951a54e9f8f14c Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Fri, 16 Jun 2023 10:45:37 +0200 Subject: [PATCH 03/29] graphql: Add schemas for videos, publications, update schema for news. Add some extra info to pageInfo object --- amelie/graphql/pagination/connection.py | 2 +- amelie/graphql/pagination/connection_field.py | 14 +++- amelie/graphql/pagination/objects_type.py | 24 +++++- amelie/news/graphql.py | 51 +++++++++++- amelie/personal_tab/jsonapi.py | 24 ------ amelie/publications/graphql.py | 60 ++++++++++++++ amelie/settings/generic.py | 2 + amelie/videos/graphql.py | 82 +++++++++++++++++++ 8 files changed, 226 insertions(+), 33 deletions(-) delete mode 100644 amelie/personal_tab/jsonapi.py create mode 100644 amelie/publications/graphql.py create mode 100644 amelie/videos/graphql.py diff --git a/amelie/graphql/pagination/connection.py b/amelie/graphql/pagination/connection.py index ac760b3..203e5b4 100644 --- a/amelie/graphql/pagination/connection.py +++ b/amelie/graphql/pagination/connection.py @@ -8,7 +8,7 @@ from amelie.graphql.pagination.objects_type import PageInfoExtra -# Source: https://github.com/instruct-br/graphene-django-pagination +# Based on: https://github.com/instruct-br/graphene-django-pagination class PaginationConnection(Connection): class Meta: abstract = True diff --git a/amelie/graphql/pagination/connection_field.py b/amelie/graphql/pagination/connection_field.py index 452a589..f2dbdc4 100644 --- a/amelie/graphql/pagination/connection_field.py +++ b/amelie/graphql/pagination/connection_field.py @@ -12,7 +12,7 @@ from amelie.graphql.pagination.objects_type import PageInfoExtra -# Source: https://github.com/instruct-br/graphene-django-pagination +# Based on: https://github.com/instruct-br/graphene-django-pagination class DjangoPaginationConnectionField(DjangoFilterConnectionField): def __init__( self, @@ -91,7 +91,11 @@ def connection_from_list_slice( results=list_slice, page_info=pageinfo_type( has_previous_page=False, - has_next_page=False + has_next_page=False, + page=1, + num_pages=1, + limit=limit, + offset=offset ) ) else: @@ -113,7 +117,11 @@ def connection_from_list_slice( results=_slice, page_info=pageinfo_type( has_previous_page=page.has_previous(), - has_next_page=page.has_next() + has_next_page=page.has_next(), + page=page_num, + num_pages=paginator.num_pages, + limit=limit, + offset=offset ) ) diff --git a/amelie/graphql/pagination/objects_type.py b/amelie/graphql/pagination/objects_type.py index 6326fc1..def042c 100644 --- a/amelie/graphql/pagination/objects_type.py +++ b/amelie/graphql/pagination/objects_type.py @@ -1,7 +1,7 @@ -from graphene import ObjectType, Boolean +from graphene import ObjectType, Boolean, Int -# Source: https://github.com/instruct-br/graphene-django-pagination +# Based on: https://github.com/instruct-br/graphene-django-pagination class PageInfoExtra(ObjectType): has_next_page = Boolean( required=True, @@ -13,3 +13,23 @@ class PageInfoExtra(ObjectType): name="hasPreviousPage", description="When paginating backwards, are there more items?", ) + page = Int( + required=True, + name="page", + description="Current page number" + ) + num_pages = Int( + required=True, + name="numPages", + description="Total page count" + ) + limit = Int( + required=False, + name="limit", + description="Limit as given to query" + ) + offset = Int( + required=True, + name="offset", + description="Offset as given to query" + ) diff --git a/amelie/news/graphql.py b/amelie/news/graphql.py index 4036c8f..659809f 100644 --- a/amelie/news/graphql.py +++ b/amelie/news/graphql.py @@ -1,6 +1,9 @@ import graphene -from graphene_django_extras import DjangoObjectType, DjangoObjectField, DjangoFilterPaginateListField +from graphene_django import DjangoObjectType +from django.utils.translation import gettext_lazy as _ + +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField from amelie.news.models import NewsItem @@ -15,11 +18,53 @@ class Meta: 'publication_date': ("exact", "gt", "lt"), 'publisher': ("exact", ), } + fields = [ + "id", + "publication_date", + "title_nl", + "title_en", + "slug", + "introduction_nl", + "introduction_en", + "content_nl", + "content_en", + "publisher", + "author", + "attachments", + "activities", + "pinned", + ] + + author = graphene.String(description=_("Message author")) + publisher = graphene.String(description=_("Publishing committee")) + + # Translated fields in user's preferred language + title = graphene.String(description=_("Message title (localized for user)")) + introduction = graphene.String(description=_("Message introduction (localized for user)")) + content = graphene.String(description=_("Message content (localized for user)")) + + def resolve_author(obj: NewsItem, info): + return obj.author.incomplete_name() + + def resolve_publisher(obj: NewsItem, info): + return obj.publisher.name + + def resolve_title(obj: NewsItem, info): + return obj.title + + def resolve_introduction(obj: NewsItem, info): + return obj.introduction + + def resolve_content(obj: NewsItem, info): + return obj.content class NewsQuery(graphene.ObjectType): - news_item = DjangoObjectField(NewsItemType) - news_items = DjangoFilterPaginateListField(NewsItemType) + news_item = graphene.Field(NewsItemType, id=graphene.ID()) + news_items = DjangoPaginationConnectionField(NewsItemType) + + def resolve_news_item(root, info, id): + return NewsItem.objects.get(pk=id) # Exports diff --git a/amelie/personal_tab/jsonapi.py b/amelie/personal_tab/jsonapi.py deleted file mode 100644 index cdda30b..0000000 --- a/amelie/personal_tab/jsonapi.py +++ /dev/null @@ -1,24 +0,0 @@ -from jsonrpc import jsonrpc_method - -from amelie.personal_tab.models import Category, Article - - -@jsonrpc_method('getItems() -> Array', authenticated=False) -def getItemStream(request): - result = [] - categories = Category.objects.all() - for category in categories: - categorydict = ({ - "category": category.name, - "category-image": category.image, - "items": [] - }) - articles = Article.objects.filter(category=category) - for article in articles: - categorydict["items"].append({ - "name": article.name, - "price": article.price, - "article-image": article.image - }) - result.append(categorydict) - return result diff --git a/amelie/publications/graphql.py b/amelie/publications/graphql.py new file mode 100644 index 0000000..e8ab13f --- /dev/null +++ b/amelie/publications/graphql.py @@ -0,0 +1,60 @@ +import graphene + +from graphene_django import DjangoObjectType + +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField +from amelie.publications.models import Publication, PublicationType + + +class PublicationTypeType(DjangoObjectType): + class Meta: + model = PublicationType + description = "Type definition for a type of Publication" + fields = [ + "type_name", + "description", + ] + + +class PublicationItemType(DjangoObjectType): + class Meta: + model = Publication + description = "Type definition for a single Publication" + filter_fields = { + 'id': ("exact",), + 'name': ("icontains", "iexact"), + 'date_published': ("exact", "gt", "lt"), + 'publication_type__type_name': ("icontains", "iexact"), + 'is_featured': ("exact",), + } + fields = [ + "id", + "name", + "description", + "date_published", + "publication_type", + "thumbnail", + "file", + "is_featured", + "public", + ] + + @classmethod + def get_queryset(cls, queryset, info): + return queryset.filter_public(info.context) + + def resolve_thumbnail(obj: Publication, info): + return obj.get_thumbnail() + + +class PublicationQuery(graphene.ObjectType): + publication = graphene.Field(PublicationItemType, id=graphene.ID()) + publications = DjangoPaginationConnectionField(PublicationItemType) + + def resolve_publication(root, info, id): + return Publication.objects.filter_public(info.context).get(pk=id) + + +# Exports +GRAPHQL_QUERIES = [PublicationQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index c597106..eaabc2b 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -400,6 +400,8 @@ GRAPHQL_SCHEMAS = [ "amelie.members.graphql", "amelie.news.graphql", + "amelie.publications.graphql", + "amelie.videos.graphql", ] GRAPHENE_DJANGO_EXTRAS = { diff --git a/amelie/videos/graphql.py b/amelie/videos/graphql.py new file mode 100644 index 0000000..419186d --- /dev/null +++ b/amelie/videos/graphql.py @@ -0,0 +1,82 @@ +import graphene +import django_filters + +from django.db import models +from django.utils.translation import gettext_lazy as _ +from graphene_django import DjangoObjectType + +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField +from amelie.videos.models import BaseVideo + + +class VideoFilterSet(django_filters.FilterSet): + class Meta: + Model = BaseVideo + fields = { + 'video_id': ("exact",), + 'title': ("icontains", "iexact"), + 'date_published': ("exact", "gt", "lt"), + 'publisher': ("icontains", "iexact"), + 'is_featured': ("exact",), + } + + class VideoTypes(models.TextChoices): + YOUTUBE = 'youtube', _('YouTube') + STREAMING_IA = 'streamingia', _('Streaming.IA') + + video_type = django_filters.ChoiceFilter(method='video_type_filter', choices=VideoTypes.choices) + + def video_type_filter(self, qs, filter_field, value): + if value == "youtube": + return qs.filter(youtubevideo__isnull=False) + elif value == "streamingia": + return qs.filter(streamingiavideo__isnull=False) + else: + return qs + + +class VideoType(DjangoObjectType): + class Meta: + model = BaseVideo + description = "Type definition for a single Video" + filterset_class = VideoFilterSet + fields = [ + "video_id", + "title", + "description", + "date_published", + "thumbnail_url", + "publisher", + "is_featured", + "public", + ] + + publisher = graphene.String(description=_("Publishing committee")) + video_type = graphene.String(description=_("Video type (Youtube or IA)")) + video_url = graphene.String(description=_("URL to the video")) + + @classmethod + def get_queryset(cls, queryset, info): + return queryset.filter_public(info.context) + + def resolve_publisher(obj: BaseVideo, info): + return obj.publisher.name + + def resolve_video_type(obj: BaseVideo, info): + return obj.get_video_type() + + def resolve_video_url(obj: BaseVideo, info): + return obj.get_absolute_url() + + +class VideoQuery(graphene.ObjectType): + video = graphene.Field(VideoType, id=graphene.ID()) + videos = DjangoPaginationConnectionField(VideoType) + + def resolve_video(root, info, id): + return BaseVideo.objects.filter_public(info.context).get(pk=id) + + +# Exports +GRAPHQL_QUERIES = [VideoQuery] +GRAPHQL_MUTATIONS = [] From 2ff19c466b695e536c0a2821c4e2dacb41ab0ccb Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Fri, 16 Jun 2023 15:08:56 +0200 Subject: [PATCH 04/29] graphql: Re-implement members graphql to only include public models and fields, fix videos filter --- amelie/members/graphql.py | 216 +++++++++++++++++++++++++----- amelie/members/graphql_types.py | 227 -------------------------------- amelie/videos/graphql.py | 4 +- 3 files changed, 184 insertions(+), 263 deletions(-) delete mode 100644 amelie/members/graphql_types.py diff --git a/amelie/members/graphql.py b/amelie/members/graphql.py index f5b69c2..921ccab 100644 --- a/amelie/members/graphql.py +++ b/amelie/members/graphql.py @@ -1,46 +1,194 @@ import graphene +import django_filters +from graphql import GraphQLError +from graphene_django import DjangoObjectType +from django_filters import FilterSet +from django.db.models import Q +from django.utils.translation import gettext_lazy as _ from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField -from amelie.members.graphql_types import PersonType, CommitteeType, FunctionType, DogroupType, DogroupGenerationType, \ - AssociationType, StudentType, StudyPeriodType, EmployeeType, PhotographerType, CommitteeCategoryType +from amelie.members.models import Committee, Function, CommitteeCategory + + +class FunctionType(DjangoObjectType): + class Meta: + model = Function + description = "Type definition for a single Function" + fields = ["person", "committee", "function", "begin", "end"] + + person = graphene.String(description=_("Person name")) + is_current_member = graphene.Boolean(description=_("This person is currently a member of this committee")) + + def resolve_person(obj: Function, info): + return obj.person.incomplete_name() + + def resolve_is_current_member(obj: Function, info): + return obj.end is None and obj.committee.abolished is None + + def resolve_begin(obj: Function, info): + # Begin date is only accessible for board members + if hasattr(info.context, 'user') and info.context.user.is_authenticated and info.context.is_board: + return obj.begin + raise GraphQLError("Object access denied.") + + def resolve_end(obj: Function, info): + # End date is only accessible for board members + if hasattr(info.context, 'user') and info.context.user.is_authenticated and info.context.is_board: + return obj.end + raise GraphQLError("Object access denied.") + + +class CommitteeFilterSet(FilterSet): + class Meta: + model = Committee + fields = { + 'id': ("exact",), + 'name': ("icontains", "iexact"), + 'founded': ("exact", "gt", "lt"), + 'abolished': ("exact", "gt", "lt"), + } + + include_abolished = django_filters.BooleanFilter(method="include_abolished_filter", required=True) + + def include_abolished_filter(self, qs, filter_field, value): + """ + Only active committees should be returned, + unless specifically asked for by a board member or by someone who was a member of that committee + """ + # If abolished committees are requested, we need to check if the user is logged in and allowed to see them + if value and hasattr(self.request, 'user') and self.request.user.is_authenticated: + # If user is a board member, include all committees + if self.request.is_board: + return qs + # If user was a member of the committee, include active committees and committees in which they were active + if self.request.user.person is not None: + return qs.filter( + Q(abolished__isnull=True) | Q(function__person=self.request.user.person) + ).distinct() + # Else only return active committees + return qs.filter(abolished__isnull=True) + + +class CommitteeType(DjangoObjectType): + class Meta: + model = Committee + description = "Type definition for a single Committee" + filterset_class = CommitteeFilterSet + fields = [ + "id", + "name", + "abbreviation", + "category", + "parent_committees", + "slug", + "email", + "founded", + "abolished", + "website", + "information_nl", + "information_en", + "logo", + "group_picture", + "function_set", + ] + + function_set = graphene.Field(graphene.List(FunctionType, description=_("Members of this committee")), + include_past_members=graphene.Boolean()) + + # Translated fields in user's preferred language + information = graphene.String(description=_("Committee information (localized for user)")) + + def resolve_email(obj: Committee, info): + """Resolves committee e-mail. Returns None if the e-mail is private and the user is not a board member.""" + if obj.private_email and not info.context.is_board: + return None + return obj.email + + def resolve_function_set(obj: Committee, info, include_past_members=False): + """ + Only current members should be returned as part of a category, + unless specifically asked for by a board member + """ + # If past members are requested, only include them if the user is a board member + if include_past_members and hasattr(info.context, 'user') and info.context.user.is_authenticated and info.context.is_board: + return obj.function_set.all() + # Else only return current members + return obj.function_set.filter(end__isnull=True) + + def resolve_information(obj: Committee, info): + return obj.information + + +class CommitteeCategoryType(DjangoObjectType): + class Meta: + model = CommitteeCategory + description = "Type definition for a single CommitteeCategory" + filter_fields = { + 'name': ("icontains", "iexact"), + } + fields = ["id", "name", "slug", "committee_set"] + + committee_set = graphene.Field(graphene.List(CommitteeType, description=_("Committees in this category")), + include_abolished=graphene.Boolean()) + + def resolve_committee_set(obj: CommitteeCategory, info, include_abolished=False): + """ + Only active committees should be returned as part of a category, + unless specifically asked for by a board member or by someone who was a member of that committee + """ + # If abolished committees are requested, we need to check if the user is allowed to see them + if include_abolished and hasattr(info.context, 'user') and info.context.user.is_authenticated: + # If user is a board member, include all committees + if info.context.is_board: + return obj.committee_set.all() + # If user was a member of the committee, include active committees and committees in which they were active + if info.context.user.person is not None: + return obj.committee_set.filter( + Q(abolished__isnull=True) | Q(function__person=info.context.person) + ).distinct() + # Else only return active committees + return obj.committee_set.filter(abolished__isnull=True) class MembersQuery(graphene.ObjectType): - dogroup = graphene.Field(DogroupType, id=graphene.ID()) - dogroups = DjangoPaginationConnectionField(DogroupType) + committee_category = graphene.Field(CommitteeCategoryType, id=graphene.ID(), slug=graphene.String()) + committee_categories = DjangoPaginationConnectionField(CommitteeCategoryType) - dogroupGeneration = graphene.Field(DogroupGenerationType, id=graphene.ID()) - dogroupGenerations = DjangoPaginationConnectionField(DogroupGenerationType) - - association = graphene.Field(AssociationType, id=graphene.ID()) - associations = DjangoPaginationConnectionField(AssociationType) - - person = graphene.Field(PersonType, id=graphene.ID()) - persons = DjangoPaginationConnectionField(PersonType) - - student = graphene.Field(StudentType, id=graphene.ID()) - students = DjangoPaginationConnectionField(StudentType) - - studyPeriod = graphene.Field(StudyPeriodType, id=graphene.ID()) - studyPeriods = DjangoPaginationConnectionField(StudyPeriodType) - - employee = graphene.Field(EmployeeType, id=graphene.ID()) - employees = DjangoPaginationConnectionField(EmployeeType) - - photographer = graphene.Field(PhotographerType, id=graphene.ID()) - photographers = DjangoPaginationConnectionField(PhotographerType) - - committeeCategory = graphene.Field(CommitteeCategoryType, id=graphene.ID()) - committeeCategories = DjangoPaginationConnectionField(CommitteeCategoryType) - - committee = graphene.Field(CommitteeType, id=graphene.ID()) + committee = graphene.Field(CommitteeType, id=graphene.ID(), slug=graphene.String()) committees = DjangoPaginationConnectionField(CommitteeType) - function = graphene.Field(FunctionType, id=graphene.ID()) - functions = DjangoPaginationConnectionField(FunctionType) - - def resolve_person(root, *args, **kwargs): - return PersonType.get_object(root, *args, **kwargs) + def resolve_committee_category(root, info, id=None, slug=None): + """Find committee category by ID or slug""" + if id is not None: + return CommitteeCategory.objects.get(pk=id) + if slug is not None: + return CommitteeCategory.objects.get(slug=slug) + return None + + def resolve_committee(root, info, id=None, slug=None): + """Find committee by ID or slug, if the user is allowed to see it""" + # Logged-in users can see more committees than non-logged-in users. + if hasattr(info.context, 'user') and info.context.user.is_authenticated: + # Board members can see all committees, including abolished ones + if info.context.is_board: + qs = Committee.objects + + # Logged-in users can see abolished committees that they were a part of + else: + qs = Committee.objects.filter( + Q(abolished__isnull=True) | Q(function__person=info.context.person) + ).distinct() + + # Non-logged in users are only allowed to see active committees + else: + qs = Committee.objects.filter(abolished__isnull=True) + + # Find the committee by its ID or slug + if id is not None: + return qs.get(pk=id) + if slug is not None: + return qs.get(slug=slug) + return None # Exports diff --git a/amelie/members/graphql_types.py b/amelie/members/graphql_types.py deleted file mode 100644 index 5c7b8fb..0000000 --- a/amelie/members/graphql_types.py +++ /dev/null @@ -1,227 +0,0 @@ -import django_filters -from graphene_django import DjangoObjectType -from django_filters import FilterSet -from graphql import GraphQLError - -import amelie.graphql.filters as custom_filters -from amelie.graphql.decorators import allow_only_self_or_board -from amelie.members.models import Person, Committee, Function, Dogroup, DogroupGeneration, Association, Student, \ - StudyPeriod, Employee, Photographer, CommitteeCategory - - -class DogroupFilterSet(FilterSet): - class Meta: - Model = Dogroup - fields = ["name"] - - -class DogroupType(DjangoObjectType): - class Meta: - model = Dogroup - description = "Type definition for a single Dogroup" - filterset_class = DogroupFilterSet - - -class DogroupGenerationFilterSet(FilterSet): - class Meta: - model = DogroupGeneration - fields = ["generation", "dogroup", "parents", "study", "mail_alias"] - - -class DogroupGenerationType(DjangoObjectType): - class Meta: - model = DogroupGeneration - description = "Type definition for a single DogroupGeneration" - filterset_class = DogroupGenerationFilterSet - - -class AssociationFilterSet(FilterSet): - class Meta: - model = Association - fields = ["name", "studies"] - - -class AssociationType(DjangoObjectType): - class Meta: - model = Association - description = "Type defintion for a single Association" - filterset_class = AssociationFilterSet - - -class PersonFilterSet(FilterSet): - sm_number = django_filters.CharFilter(method='sm_number_filter') - underage = django_filters.BooleanFilter(method='underage_filter') - also_old_members = django_filters.BooleanFilter(method='also_old_members_filter') - only_old_members = django_filters.BooleanFilter(method='only_old_members_filter') - has_not_paid = django_filters.BooleanFilter(method='has_not_paid_filter') - was_member_in = custom_filters.NumberInFilter(method='was_member_in_filter') - membership_type__in = custom_filters.NumberInFilter(method='membership_type__in_filter') - study__in = custom_filters.NumberInFilter(method='study__in_filter') - primary_studies = django_filters.CharFilter(method='primary_studies_filter') - study_year__in = custom_filters.NumberInFilter(method='study_year__in_filter') - is_employee = django_filters.BooleanFilter(method='is_employee_filter') - department__in = custom_filters.NumberInFilter(method='department__in_filter') - is_active = django_filters.BooleanFilter(method='is_active_filter') - all_committees__contains = django_filters.CharFilter(method='all_committees__contains_filter') - current_committees__contains = django_filters.CharFilter(method='current_committees__contains_filter') - was_active_in = custom_filters.NumberInFilter(method='was_active_in_filter') - has_dogroup = django_filters.BooleanFilter(method='has_dogroup_filter') - dogroup__in = custom_filters.NumberInFilter(method='dogroup__in_filter') - mandate_type__in = custom_filters.NumberInFilter(method='mandate_type__in_filter') - mandate_number = django_filters.NumberFilter(method='mandate_number_filter') - iban = django_filters.CharFilter(method='iban_filter') - invert_preferences = django_filters.BooleanFilter(method='invert_preferences_filter') - - second_year_or_higher = django_filters.BooleanFilter(method='second_year_or_higher_filter') - third_year_or_higher = django_filters.BooleanFilter(method='third_year_or_higher_filter') - fourth_year_or_higher = django_filters.BooleanFilter(method='fourth_year_or_higher_filter') - fifth_year_or_higher = django_filters.BooleanFilter(method='fifth_year_or_higher_filter') - - class Meta: - model = Person - fields = { - "id": ["exact"], - "first_name": ["icontains"], - "last_name_prefix": ["icontains"], - "last_name": ["icontains"], - "initials": ["icontains"], - "slug": ["icontains"], - "gender": ["exact"], - "preferred_language": ["exact"], - "international_member": ["exact"], - "email_address": ["icontains"], - "account_name": ["icontains"], - "nda": ["exact"], - "preferences": ["exact", "in"], - "user": ["exact"], - } - - -class PersonType(DjangoObjectType): - class Meta: - model = Person - description = "Type definition for a single Person" - filterset_class = PersonFilterSet - only_fields = [ - "first_name", "last_name_prefix", "last_name", "initials", "slug", - "picture", "notes", "gender", "date_of_birth", - - "preferred_language", "international_member", - - "email_address", "address", "postal_code", "city", "country", "telephone", - - "email_address_parents", "address_parents", "postal_code_parents", - "city_parents", "country_parents", "can_use_parents_address", - - "account_name", "shell", "webmaster", "nda", "preferences", "user", - - "is_board" - ] - - @classmethod - def get_queryset(cls, queryset, info): - user = info.context.user - if not user.is_authenticated: - raise GraphQLError("Object access denied.") - if not user.is_superuser: - return queryset.filter(user=info.context.user) - return queryset - - @classmethod - def get_object(cls, root, info, id): - return cls.get_queryset(cls._meta.model.objects, info).get(id=id) - - @allow_only_self_or_board("context.user.person.id") - def resolve_telephone(self, info): - return self.telephone - - -class StudentFilterSet(FilterSet): - class Meta: - model = Student - fields = ["person", "number"] - - -class StudentType(DjangoObjectType): - class Meta: - model = Student - description = "Type definition for a single Student" - filterset_class = StudentFilterSet - - -class StudyPeriodFilterSet(FilterSet): - class Meta: - model = StudyPeriod - fields = ["student", "study", "begin", "end", "graduated", "dogroup"] - - -class StudyPeriodType(DjangoObjectType): - class Meta: - model = StudyPeriod - description = "Type definition for a single StudyPeriod" - filterset_class = StudyPeriodFilterSet - - -class EmployeeFilterSet(FilterSet): - class Meta: - model = Employee - fields = ["person", "number", "end"] - - -class EmployeeType(DjangoObjectType): - class Meta: - model = Employee - description = "Type definition for a single Employee" - filterset_class = EmployeeFilterSet - - -class PhotographerFilterSet(FilterSet): - class Meta: - model = Photographer - fields = ["first_name", "last_name_prefix", "last_name", "person"] - - -class PhotographerType(DjangoObjectType): - class Meta: - model = Photographer - description = "Type definition for a single Photographer" - filterset_class = PhotographerFilterSet - - -class CommitteeCategoryFilterSet(FilterSet): - class Meta: - model = CommitteeCategory - fields = ["name", "slug"] - - -class CommitteeCategoryType(DjangoObjectType): - class Meta: - model = CommitteeCategory - description = "Type definition for a single CommitteeCategory" - filterset_class = CommitteeCategoryFilterSet - - -class CommitteeFilterSet(FilterSet): - class Meta: - model = Committee - exclude = ["logo", "group_picture"] - - -class CommitteeType(DjangoObjectType): - class Meta: - model = Committee - description = "Type definition for a single Committee" - filterset_class = CommitteeFilterSet - - -class FunctionFilterSet(FilterSet): - class Meta: - model = Function - fields = ["person", "committee", "function", "note", "begin", "end"] - - -class FunctionType(DjangoObjectType): - class Meta: - model = Function - description = "Type definition for a single Function" - filterset_class = FunctionFilterSet diff --git a/amelie/videos/graphql.py b/amelie/videos/graphql.py index 419186d..c34c719 100644 --- a/amelie/videos/graphql.py +++ b/amelie/videos/graphql.py @@ -11,12 +11,12 @@ class VideoFilterSet(django_filters.FilterSet): class Meta: - Model = BaseVideo + model = BaseVideo fields = { 'video_id': ("exact",), 'title': ("icontains", "iexact"), 'date_published': ("exact", "gt", "lt"), - 'publisher': ("icontains", "iexact"), + 'publisher__name': ("icontains", "iexact"), 'is_featured': ("exact",), } From 908ab1fa2ddf925c6dd130e6d8756bd72c35f5bf Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Sun, 18 Jun 2023 17:45:34 +0200 Subject: [PATCH 05/29] graphql: Add queries for Education pages --- amelie/education/graphql.py | 80 +++++++++++++++++++++++++++++++++++++ amelie/settings/generic.py | 1 + 2 files changed, 81 insertions(+) create mode 100644 amelie/education/graphql.py diff --git a/amelie/education/graphql.py b/amelie/education/graphql.py new file mode 100644 index 0000000..cdd264f --- /dev/null +++ b/amelie/education/graphql.py @@ -0,0 +1,80 @@ +import graphene + +from graphene_django import DjangoObjectType +from django.utils.translation import gettext_lazy as _ +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + +from amelie.education.models import Category, Page + + +# Notice: +# Education Events are implemented in amelie/calendar/graphql.py as part of the general event interface + + +class EducationPageType(DjangoObjectType): + class Meta: + model = Page + description = "Type definition for a single Education Page" + filter_fields = { + 'id': ("exact",), + 'name_nl': ("icontains", "iexact"), + 'name_en': ("icontains", "iexact"), + } + fields = [ + "id", "name_nl", "name_en", "slug", "category", "content_nl", "content_en", "last_changed", "position" + ] + + # Translated fields in user's preferred language + name = graphene.String(description=_("Page name (localized for user)")) + content = graphene.String(description=_("Page content (localized for user)")) + + def resolve_name(obj: Page, info): + return obj.name + + def resolve_content(obj: Page, info): + return obj.content + + +class EducationPageCategoryType(DjangoObjectType): + class Meta: + model = Category + description = "Type definition for a single education page Category" + filter_fields = { + 'id': ("exact",), + 'name_nl': ("icontains", "iexact"), + 'name_en': ("icontains", "iexact"), + } + fields = ["id", "name_nl", "name_en", "page_set"] + + # Translated fields in user's preferred language + name = graphene.String(description=_("Category name (localized for user)")) + + def resolve_name(obj: Category, info): + return obj.name + + +class EducationQuery(graphene.ObjectType): + educationpage_category = graphene.Field(EducationPageCategoryType, id=graphene.ID()) + educationpage_categories = DjangoPaginationConnectionField(EducationPageCategoryType) + + educationpage = graphene.Field(EducationPageType, id=graphene.ID(), slug=graphene.String()) + educationpages = DjangoPaginationConnectionField(EducationPageType) + + def resolve_educationpage_category(root, info, id=None): + """Find education page category by ID""" + if id is not None: + return Category.objects.get(pk=id) + return None + + def resolve_educationpage(root, info, id=None, slug=None): + """Find education page by ID or slug""" + if id is not None: + return Page.objects.get(pk=id) + if slug is not None: + return Page.objects.get(slug=slug) + return None + + +# Exports +GRAPHQL_QUERIES = [EducationQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index eaabc2b..d5a8114 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -398,6 +398,7 @@ } GRAPHQL_SCHEMAS = [ + "amelie.education.graphql", "amelie.members.graphql", "amelie.news.graphql", "amelie.publications.graphql", From 6267bd9fe31bcae119bc113513ba03a19a627c76 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 16 Oct 2023 22:54:07 +0200 Subject: [PATCH 06/29] Add a basic activities query --- amelie/activities/graphql.py | 57 ++++++++++++++++++++++++++++++++++++ amelie/settings/generic.py | 1 + 2 files changed, 58 insertions(+) create mode 100644 amelie/activities/graphql.py diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py new file mode 100644 index 0000000..dd1caa9 --- /dev/null +++ b/amelie/activities/graphql.py @@ -0,0 +1,57 @@ +import graphene +from django_filters import FilterSet +from graphene_django import DjangoObjectType + +from amelie.activities.models import Activity +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + + +class ActivityFilterSet(FilterSet): + class Meta: + model = Activity + fields = { + 'id': ("exact", ), + 'summary_nl': ("icontains", "iexact"), + 'summary_en': ("icontains", "iexact"), + 'begin': ("gt", "lt", "exact"), + 'end': ("gt", "lt", "exact"), + 'dutch_activity': ("exact", ), + } + + +class ActivityType(DjangoObjectType): + class Meta: + model = Activity + fields = [ + "id", + "begin", + "end", + "entire_day", + "summary_nl", + "summary_en", + "promo_nl", + "promo_en", + "description_nl", + "description_en", + "organizer", + "location", + "public", + "attachments", + "dutch_activity", + "callback_url", + "callback_secret_key" + ] + filterset_class = ActivityFilterSet + + +class ActivitiesQuery(graphene.ObjectType): + activities = DjangoPaginationConnectionField(ActivityType, organizer=graphene.ID()) + + def resolve_activities(self, info, organizer=None, *args, **kwargs): + if organizer: + return Activity.objects.filter(organizer__pk=organizer) + return Activity.objects.all() + +# Exports +GRAPHQL_QUERIES = [ActivitiesQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index 3f7cf23..2dba0c5 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -401,6 +401,7 @@ } GRAPHQL_SCHEMAS = [ + "amelie.activities.graphql", "amelie.education.graphql", "amelie.members.graphql", "amelie.news.graphql", From 88cdaedf352afaa959b18280f3342495a930bc6c Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 30 Oct 2023 22:28:07 +0100 Subject: [PATCH 07/29] Extend activity graphql endpoint --- amelie/activities/graphql.py | 87 +++++++++++++++++++++++++++++++++++- amelie/files/graphql.py | 38 ++++++++++++++++ amelie/settings/generic.py | 1 + 3 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 amelie/files/graphql.py diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index dd1caa9..c675ab1 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -2,7 +2,8 @@ from django_filters import FilterSet from graphene_django import DjangoObjectType -from amelie.activities.models import Activity +from amelie.activities.models import Activity, ActivityLabel +from amelie.files.models import Attachment from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField @@ -39,10 +40,92 @@ class Meta: "attachments", "dutch_activity", "callback_url", - "callback_secret_key" + "enrollment", + "enrollment_begin", + "enrollment_end", + "maximum", + "waiting_list_locked", + "photos", + "components", + "price", + "can_unenroll", + "image_icon", + "activity_label" ] filterset_class = ActivityFilterSet + absolute_url = graphene.String() + random_photo_url = graphene.String() + photo_url = graphene.String() + calendar_url = graphene.String() + enrollment_open = graphene.Boolean() + enrollment_closed = graphene.Boolean() + can_edit = graphene.Boolean() + places_available = graphene.Int() + enrollment_full = graphene.Boolean() + has_waiting_participants = graphene.Boolean() + enrollment_almost_full = graphene.Boolean() + has_enrollment_options = graphene.Boolean() + has_costs = graphene.Boolean() + # TODO: Figure out on how to use foreign keys here! + + def resolve_absolute_url(self: Activity, info): + return self.get_absolute_url() + + def resolve_random_photo_url(self: Activity, info): + return self.get_photo_url_random() + + def resolve_photo_url(self: Activity, info): + return self.get_photo_url() + + def resolve_calendar_url(self: Activity, info): + return self.get_calendar_url() + + def resolve_enrollment_open(self: Activity, info): + return self.get_enrollment_open() + + def resolve_enrollment_closed(self: Activity, info): + return self.get_enrollment_closed() + + def resolve_can_edit(self: Activity, info): + if hasattr(info.context.user, 'person'): + return self.can_edit(info.context.user.person) + return False + + def resolve_places_available(self: Activity, info): + return self.places_available() + + def resolve_enrollment_full(self: Activity, info): + return self.enrollment_full() + + def resolve_has_waiting_participants(self: Activity, info): + return self.has_waiting_participants() + + def resolve_enrollment_almost_full(self: Activity, info): + return self.enrollment_almost_full() + + def resolve_has_enrollment_option(self: Activity, info): + return self.has_enrollmentoption() + + def resolve_has_costs(self: Activity, info): + return self.has_costs() + + # TODO: Write custom resolvers and attributes for functions defined on the events class (inherited by Activity) + + +class ActivityLabelType(DjangoObjectType): + class Meta: + model = ActivityLabel + fields = [ + "name_en", + "name_nl", + "color", + "icon", + "explanation_en", + "explanation_nl", + "active" + ] + class ActivitiesQuery(graphene.ObjectType): activities = DjangoPaginationConnectionField(ActivityType, organizer=graphene.ID()) diff --git a/amelie/files/graphql.py b/amelie/files/graphql.py new file mode 100644 index 0000000..fe50ead --- /dev/null +++ b/amelie/files/graphql.py @@ -0,0 +1,38 @@ +import graphene +from graphene_django import DjangoObjectType + +from amelie.files.models import Attachment + + +class AttachmentType(DjangoObjectType): + class Meta: + model = Attachment + fields = [ + "file", + "caption", + "thumb_small", + "thumb_medium", + "thumb_large", + "mimetype", + "owner", + "created", + "modified", + "thumb_small_height", + "thumb_small_width", + "thumb_medium_height", + "thumb_medium_width", + "thumb_large_height", + "thumb_large_width", + "public" + ] + + +class FilesQuery(graphene.ObjectType): + attachment = graphene.Field(AttachmentType, id=graphene.ID()) + + def resolve_attachment(root, info, id): + return Attachment.objects.get(pk=id) + + +GRAPHQL_QUERIES = [FilesQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index 2dba0c5..acada6c 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -403,6 +403,7 @@ GRAPHQL_SCHEMAS = [ "amelie.activities.graphql", "amelie.education.graphql", + "amelie.files.graphql", "amelie.members.graphql", "amelie.news.graphql", "amelie.publications.graphql", From c5cd1b0a081981c5742b9bb57cebc1e796faac4d Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 13 Nov 2023 21:38:06 +0100 Subject: [PATCH 08/29] Finalize public details for activities on GraphQL API --- amelie/activities/graphql.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index c675ab1..0e0ae2d 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -67,6 +67,11 @@ class Meta: enrollment_almost_full = graphene.Boolean() has_enrollment_options = graphene.Boolean() has_costs = graphene.Boolean() + summary = graphene.String() + description = graphene.String() + promo = graphene.String() + description_short = graphene.String() + # TODO: Figure out on how to use foreign keys here! def resolve_absolute_url(self: Activity, info): @@ -110,7 +115,17 @@ def resolve_has_enrollment_option(self: Activity, info): def resolve_has_costs(self: Activity, info): return self.has_costs() - # TODO: Write custom resolvers and attributes for functions defined on the events class (inherited by Activity) + def resolve_summary(self: Activity, info): + return self.summary + + def resolve_description(self: Activity, info): + return self.description + + def resolve_promo(self: Activity, info): + return self.promo1 + + def resolve_description_short(self: Activity, info): + return self.description_short() class ActivityLabelType(DjangoObjectType): From 9fe5a27cf7e35ca7f17e76355ed3fe5f2963c39f Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 13 Nov 2023 23:13:00 +0100 Subject: [PATCH 09/29] Add descriptions to attributes and their translations --- amelie/activities/graphql.py | 35 +- locale/nl/LC_MESSAGES/django.mo | Bin 261771 -> 265846 bytes locale/nl/LC_MESSAGES/django.po | 7209 ++++++++----------------------- 3 files changed, 1830 insertions(+), 5414 deletions(-) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index 0e0ae2d..ddaec7e 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -1,5 +1,6 @@ import graphene from django_filters import FilterSet +from django.utils.translation import gettext_lazy as _ from graphene_django import DjangoObjectType from amelie.activities.models import Activity, ActivityLabel @@ -54,23 +55,23 @@ class Meta: ] filterset_class = ActivityFilterSet - absolute_url = graphene.String() - random_photo_url = graphene.String() - photo_url = graphene.String() - calendar_url = graphene.String() - enrollment_open = graphene.Boolean() - enrollment_closed = graphene.Boolean() - can_edit = graphene.Boolean() - places_available = graphene.Int() - enrollment_full = graphene.Boolean() - has_waiting_participants = graphene.Boolean() - enrollment_almost_full = graphene.Boolean() - has_enrollment_options = graphene.Boolean() - has_costs = graphene.Boolean() - summary = graphene.String() - description = graphene.String() - promo = graphene.String() - description_short = graphene.String() + absolute_url = graphene.String(description=_('The absolute URL to an activity.')) + random_photo_url = graphene.String(description=_('A URL to a random picture that was made at this activity.')) + photo_url = graphene.String(description=_('A URL that points to the picture gallery for this activity.')) + calendar_url = graphene.String(description=_('A link to the ICS file for this activity.')) + enrollment_open = graphene.Boolean(description=_('Whether people can still enroll for this activity.')) + enrollment_closed = graphene.Boolean(description=_('Whether people can no longer enroll for this activity.')) + can_edit = graphene.Boolean(description=_('Whether the person that is currently signed-in can edit this activity.')) + places_available = graphene.Int(description=_('The amount of open spots that are still available.')) + enrollment_full = graphene.Boolean(description=_('Whether this activity is full.')) + has_waiting_participants = graphene.Boolean(description=_('Whether this activity has any participations that are on the waiting list.')) + enrollment_almost_full = graphene.Boolean(description=_('Whether this activity is almost full (<= 10 places left).')) + has_enrollment_options = graphene.Boolean(description=_('If there are any options for enrollments.')) + has_costs = graphene.Boolean(description=_('If there are any costs associated with this activity.')) + summary = graphene.String(description=_('A summary of this activity in the preferred language of this user.')) + description = graphene.String(description=_('A description of this activity in the preferred language of this user.')) + promo = graphene.String(description=_('Promotional text for this activity in the preferred language of this user.')) + description_short = graphene.String(description=_('A brief description of this activity (always in english).')) # TODO: Figure out on how to use foreign keys here! diff --git a/locale/nl/LC_MESSAGES/django.mo b/locale/nl/LC_MESSAGES/django.mo index 4f30f32ea9188ca1dfcafa011451c73d5823545b..2b376a972fba64eee09e93684bebe08b0505cf32 100644 GIT binary patch delta 44958 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 diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po index 1cc3f02..7661126 100644 --- a/locale/nl/LC_MESSAGES/django.po +++ b/locale/nl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-09-22 16:20+0200\n" -"PO-Revision-Date: 2023-09-22 10:31+0018\n" +"POT-Creation-Date: 2023-11-13 22:52+0100\n" +"PO-Revision-Date: 2023-11-13 23:12+0018\n" "Last-Translator: <>\n" "Language: en\n" "MIME-Version: 1.0\n" @@ -12,44 +12,11 @@ msgstr "" "Used command: ./manage.py makemessages -e py,html,txt,mail\n" "X-Translated-Using: django-rosetta 0.9.9\n" -#: amelie/about/models.py:9 amelie/activities/models.py:26 -#: amelie/activities/models.py:464 -#: amelie/activities/templates/activity_enrollment_overview.html:62 -#: amelie/activities/templates/activity_enrollment_overview.html:180 -#: amelie/activities/templates/activity_enrollment_print.html:29 -#: amelie/claudia/templates/claudia/aliasgroup_list.html:21 -#: amelie/claudia/templates/claudia/contact_list.html:20 -#: amelie/claudia/templates/claudia/email_detail.html:16 -#: amelie/claudia/templates/claudia/extragroup_list.html:21 -#: amelie/claudia/templates/claudia/extraperson_list.html:20 -#: amelie/claudia/templates/claudia/mapping_detail.html:18 -#: amelie/claudia/templates/claudia/mapping_detail.html:84 -#: amelie/claudia/templates/claudia/mapping_detail.html:139 -#: amelie/claudia/templates/claudia/mapping_timeline.html:21 -#: amelie/claudia/templates/claudia/shareddrive_list.html:21 -#: amelie/claudia/templates/claudia/timeline_list.html:20 -#: amelie/education/models.py:25 amelie/education/models.py:47 -#: amelie/education/models.py:132 amelie/education/models.py:178 -#: amelie/members/models.py:36 amelie/members/models.py:57 -#: amelie/members/models.py:81 amelie/members/models.py:121 -#: amelie/members/models.py:218 amelie/members/models.py:248 -#: amelie/members/models.py:660 amelie/members/models.py:690 -#: amelie/members/models.py:874 amelie/members/models.py:897 -#: amelie/members/templates/committee_members.html:7 -#: amelie/members/templates/includes/registration/personal_details.html:14 -#: amelie/members/templates/includes/registration/personal_details_employee.html:14 -#: amelie/members/templates/registration_check.html:34 -#: amelie/personal_tab/models.py:253 amelie/personal_tab/models.py:281 -#: amelie/personal_tab/models.py:319 amelie/personal_tab/statistics.py:266 -#: amelie/personal_tab/templates/exports/screen.html:67 -#: amelie/room_duty/models.py:17 amelie/tools/pdf.py:98 +#: amelie/about/models.py:9 amelie/activities/models.py:26 amelie/activities/models.py:464 amelie/activities/templates/activity_enrollment_overview.html:62 amelie/activities/templates/activity_enrollment_overview.html:180 amelie/activities/templates/activity_enrollment_print.html:29 amelie/claudia/templates/claudia/aliasgroup_list.html:21 amelie/claudia/templates/claudia/contact_list.html:20 amelie/claudia/templates/claudia/email_detail.html:16 amelie/claudia/templates/claudia/extragroup_list.html:21 amelie/claudia/templates/claudia/extraperson_list.html:20 amelie/claudia/templates/claudia/mapping_detail.html:18 amelie/claudia/templates/claudia/mapping_detail.html:84 amelie/claudia/templates/claudia/mapping_detail.html:139 amelie/claudia/templates/claudia/mapping_timeline.html:21 amelie/claudia/templates/claudia/shareddrive_list.html:21 amelie/claudia/templates/claudia/timeline_list.html:20 amelie/education/models.py:25 amelie/education/models.py:47 amelie/education/models.py:132 amelie/education/models.py:178 amelie/members/models.py:36 amelie/members/models.py:57 amelie/members/models.py:81 amelie/members/models.py:121 amelie/members/models.py:218 amelie/members/models.py:248 amelie/members/models.py:660 amelie/members/models.py:690 amelie/members/models.py:874 amelie/members/models.py:897 amelie/members/templates/committee_members.html:7 amelie/members/templates/includes/registration/personal_details.html:14 amelie/members/templates/includes/registration/personal_details_employee.html:14 amelie/members/templates/registration_check.html:34 amelie/personal_tab/models.py:253 amelie/personal_tab/models.py:281 amelie/personal_tab/models.py:319 amelie/personal_tab/statistics.py:266 amelie/personal_tab/templates/exports/screen.html:67 amelie/room_duty/models.py:17 amelie/tools/pdf.py:98 msgid "Name" msgstr "Naam" -#: amelie/about/models.py:10 amelie/activities/models.py:25 -#: amelie/education/models.py:26 amelie/education/models.py:48 -#: amelie/members/models.py:82 amelie/members/models.py:661 -#: amelie/personal_tab/models.py:282 amelie/personal_tab/models.py:320 +#: amelie/about/models.py:10 amelie/activities/models.py:25 amelie/education/models.py:26 amelie/education/models.py:48 amelie/members/models.py:82 amelie/members/models.py:661 amelie/personal_tab/models.py:282 amelie/personal_tab/models.py:320 msgid "Name (en)" msgstr "Naam (en)" @@ -57,9 +24,7 @@ msgstr "Naam (en)" msgid "Educational page?" msgstr "Onderwijspagina?" -#: amelie/about/models.py:14 amelie/education/models.py:51 -#: amelie/news/templates/news_item_form.html:60 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:46 +#: amelie/about/models.py:14 amelie/education/models.py:51 amelie/news/templates/news_item_form.html:60 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:46 msgid "Content" msgstr "Inhoud" @@ -67,8 +32,7 @@ msgstr "Inhoud" msgid "Content (en)" msgstr "Inhoud (en)" -#: amelie/about/models.py:20 amelie/education/models.py:58 -#: amelie/statistics/models.py:8 +#: amelie/about/models.py:20 amelie/education/models.py:58 amelie/statistics/models.py:8 msgid "Page" msgstr "Pagina" @@ -76,25 +40,17 @@ msgstr "Pagina" msgid "Pages" msgstr "Pagina's" -#: amelie/about/templates/page.html:16 -#: amelie/education/templates/awards.html:15 -#: amelie/education/templates/educational_bouquet.html:58 -#: amelie/education/templates/overview.html:58 +#: amelie/about/templates/page.html:16 amelie/education/templates/awards.html:15 amelie/education/templates/educational_bouquet.html:58 amelie/education/templates/overview.html:58 msgid "Edit Page" msgstr "Wijzig pagina" -#: amelie/about/templates/page.html:17 -#: amelie/education/templates/overview.html:62 +#: amelie/about/templates/page.html:17 amelie/education/templates/overview.html:62 msgid "Delete page" msgstr "Verwijder pagina" #: amelie/about/templates/page.html:21 -msgid "" -"This page is not marked as educational page, so you have no edit rights. " -"Think this is an error? Contact the board." -msgstr "" -"Deze pagina is niet gemarkeerd als onderwijspagina, dus je hebt geen " -"bewerkrechten. Denk je dat dit een fout is? Contacteer dan het bestuur." +msgid "This page is not marked as educational page, so you have no edit rights. Think this is an error? Contact the board." +msgstr "Deze pagina is niet gemarkeerd als onderwijspagina, dus je hebt geen bewerkrechten. Denk je dat dit een fout is? Contacteer dan het bestuur." #: amelie/about/templates/page_delete.html:13 msgid "Are you sure you want to remove this message?" @@ -104,25 +60,19 @@ msgstr "Weet je zeker dat je deze pagina wilt verwijderen?" msgid "Remove page" msgstr "Pagina verwijderen" -#: amelie/about/templates/page_form.html:6 -#: amelie/about/templates/page_form.html:16 -#: amelie/education/templates/educationpage_new.html:4 -#: amelie/education/templates/educationpage_new.html:9 +#: amelie/about/templates/page_form.html:6 amelie/about/templates/page_form.html:16 amelie/education/templates/educationpage_new.html:4 amelie/education/templates/educationpage_new.html:9 msgid "New page" msgstr "Nieuwe pagina" -#: amelie/about/templates/page_form.html:8 -#: amelie/about/templates/page_form.html:18 +#: amelie/about/templates/page_form.html:8 amelie/about/templates/page_form.html:18 msgid "Edit new" msgstr "Nieuwe bewerken" -#: amelie/about/templates/page_form.html:29 -#: amelie/education/templates/educationpage_new.html:18 +#: amelie/about/templates/page_form.html:29 amelie/education/templates/educationpage_new.html:18 msgid "Create page" msgstr "Pagina aanmaken" -#: amelie/about/templates/page_form.html:31 -#: amelie/education/templates/educationpage_edit.html:18 +#: amelie/about/templates/page_form.html:31 amelie/education/templates/educationpage_edit.html:18 msgid "Save page" msgstr "Pagina opslaan" @@ -137,13 +87,11 @@ msgstr "Informatie over de vereniging" #: amelie/about/templates/pages.html:14 msgid "" "\n" -"\t\t\t\t Information about I.C.T.S.V. Inter-Actief, her members " -"and activities can be found here.\n" +"\t\t\t\t Information about I.C.T.S.V. Inter-Actief, her members and activities can be found here.\n" "\t\t\t\t" msgstr "" "\n" -"Informatie over I.C.T.S.V. Inter-Actief, haar leden en activiteiten " -"is hier te vinden." +"Informatie over I.C.T.S.V. Inter-Actief, haar leden en activiteiten is hier te vinden." #: amelie/about/templates/pages.html:29 msgid "Add page" @@ -157,10 +105,7 @@ msgstr "IA Activiteiten" msgid "Inter-Actief's activities in the coming weeks" msgstr "De activiteiten van I.C.T.S.V. Inter-Actief in de komende tijd" -#: amelie/activities/forms.py:28 -#: amelie/activities/templates/activity_enrollment_overview.html:192 -#: amelie/activities/templates/activity_enrollment_print.html:36 -#: amelie/calendar/models.py:30 +#: amelie/activities/forms.py:28 amelie/activities/templates/activity_enrollment_overview.html:192 amelie/activities/templates/activity_enrollment_print.html:36 amelie/calendar/models.py:30 msgid "Method of payment" msgstr "Betaalwijze" @@ -176,50 +121,14 @@ msgstr "Wachtlijstactie" msgid "Skip waiting list and enroll immediately" msgstr "Sla de wachtlijst over en schrijf direct in" -#: amelie/activities/forms.py:51 amelie/activities/models.py:465 -#: amelie/activities/templates/activity_enrollment_overview.html:136 -#: amelie/activities/templates/activity_enrollment_print.html:69 -#: amelie/members/models.py:663 amelie/members/models.py:857 -#: amelie/personal_tab/forms.py:32 amelie/personal_tab/models.py:122 -#: amelie/personal_tab/models.py:286 -#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:32 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:120 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:70 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:95 -#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:17 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:52 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:193 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:248 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:291 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:327 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:381 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:420 -#: amelie/personal_tab/templates/exports/screen.html:69 -#: amelie/personal_tab/templates/info/debt_collection_instructions.html:19 -#: amelie/personal_tab/templates/info/transaction_information.html:11 -#: amelie/personal_tab/templates/lists/activity_transactions.html:14 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:12 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:14 -#: amelie/personal_tab/templates/lists/custom_transactions.html:12 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:12 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:11 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:12 -#: amelie/personal_tab/templates/lists/transactions.html:12 -#: amelie/personal_tab/templates/price_list.html:16 -#: amelie/personal_tab/templates/wrapped.html:63 -#: amelie/personal_tab/templates/wrapped.html:128 -#: amelie/personal_tab/templates/wrapped.html:169 +#: amelie/activities/forms.py:51 amelie/activities/models.py:465 amelie/activities/templates/activity_enrollment_overview.html:136 amelie/activities/templates/activity_enrollment_print.html:69 amelie/members/models.py:663 amelie/members/models.py:857 amelie/personal_tab/forms.py:32 amelie/personal_tab/models.py:122 amelie/personal_tab/models.py:286 amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:32 amelie/personal_tab/templates/cookie_corner_authorization_view.html:120 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:70 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:95 amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:17 amelie/personal_tab/templates/cookie_corner_process_batch.html:52 amelie/personal_tab/templates/cookie_corner_statistics.html:193 amelie/personal_tab/templates/cookie_corner_statistics.html:248 amelie/personal_tab/templates/cookie_corner_statistics.html:291 amelie/personal_tab/templates/cookie_corner_statistics.html:327 amelie/personal_tab/templates/cookie_corner_statistics.html:381 amelie/personal_tab/templates/cookie_corner_statistics.html:420 amelie/personal_tab/templates/exports/screen.html:69 amelie/personal_tab/templates/info/debt_collection_instructions.html:19 amelie/personal_tab/templates/info/transaction_information.html:11 amelie/personal_tab/templates/lists/activity_transactions.html:14 amelie/personal_tab/templates/lists/alexia_transactions.html:12 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:14 amelie/personal_tab/templates/lists/custom_transactions.html:12 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:12 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:11 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:12 amelie/personal_tab/templates/lists/transactions.html:12 amelie/personal_tab/templates/price_list.html:16 amelie/personal_tab/templates/wrapped.html:63 amelie/personal_tab/templates/wrapped.html:128 amelie/personal_tab/templates/wrapped.html:169 msgid "Price" msgstr "Prijs" #: amelie/activities/forms.py:96 #, python-brace-format -msgid "" -"Website enrolment has a maximum of {0} euro. Either turn off the ability to " -"enrol or decrease the cost of the activity." -msgstr "" -"Inschrijving via de website heeft een maximum van {0} euro. Of schakel de " -"inschrijfoptie uit, of verlaag de prijs van de activiteit!" +msgid "Website enrolment has a maximum of {0} euro. Either turn off the ability to enrol or decrease the cost of the activity." +msgstr "Inschrijving via de website heeft een maximum van {0} euro. Of schakel de inschrijfoptie uit, of verlaag de prijs van de activiteit!" #: amelie/activities/forms.py:100 amelie/activities/models.py:113 msgid "There is no enrollment start date entered." @@ -249,59 +158,27 @@ msgstr "Sorry, maar er zijn niet genoeg plekken over!" msgid "Photographer" msgstr "Fotograaf" -#: amelie/activities/forms.py:236 amelie/members/models.py:302 -#: amelie/members/models.py:786 amelie/members/models.py:1092 -#: amelie/members/templates/members/datablock_html.mail:4 -#: amelie/members/templates/members/datablock_plain.mail:3 +#: amelie/activities/forms.py:236 amelie/members/models.py:302 amelie/members/models.py:786 amelie/members/models.py:1092 amelie/members/templates/members/datablock_html.mail:4 amelie/members/templates/members/datablock_plain.mail:3 msgid "First name" msgstr "Voornaam" -#: amelie/activities/forms.py:237 amelie/activities/forms.py:239 -#: amelie/activities/forms.py:241 +#: amelie/activities/forms.py:237 amelie/activities/forms.py:239 amelie/activities/forms.py:241 msgid "Use this field if a non-member is the owner of these pictures" msgstr "Gebruik dit veld als een extern iemand deze foto's heeft gemaakt." -#: amelie/activities/forms.py:238 amelie/members/models.py:303 -#: amelie/members/models.py:787 amelie/members/models.py:1093 -#: amelie/members/templates/members/datablock_html.mail:5 -#: amelie/members/templates/members/datablock_plain.mail:4 +#: amelie/activities/forms.py:238 amelie/members/models.py:303 amelie/members/models.py:787 amelie/members/models.py:1093 amelie/members/templates/members/datablock_html.mail:5 amelie/members/templates/members/datablock_plain.mail:4 msgid "Last name pre-fix" msgstr "Tussenvoegsels" -#: amelie/activities/forms.py:240 amelie/members/models.py:304 -#: amelie/members/models.py:788 amelie/members/models.py:1094 -#: amelie/members/templates/members/datablock_html.mail:6 -#: amelie/members/templates/members/datablock_plain.mail:5 +#: amelie/activities/forms.py:240 amelie/members/models.py:304 amelie/members/models.py:788 amelie/members/models.py:1094 amelie/members/templates/members/datablock_html.mail:6 amelie/members/templates/members/datablock_plain.mail:5 msgid "Last name" msgstr "Achternaam" -#: amelie/activities/forms.py:242 amelie/activities/models.py:82 -#: amelie/activities/models.py:83 -#: amelie/activities/templates/activity_list.html:4 -#: amelie/activities/templates/activity_list.html:35 -#: amelie/activities/templates/activity_list.html:106 -#: amelie/activities/templates/activity_old.html:4 -#: amelie/activities/templates/activity_old.html:34 -#: amelie/calendar/models.py:27 amelie/calendar/models.py:124 -#: amelie/calendar/models.py:125 -#: amelie/companies/templates/companies/company_event_list.html:4 -#: amelie/companies/templates/companies/company_event_old.html:34 -#: amelie/personal_tab/models.py:179 amelie/personal_tab/statistics.py:285 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:14 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:182 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:190 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:42 -#: amelie/personal_tab/templates/lists/activity_transactions.html:11 -#: amelie/personal_tab/templates/lists/transactions_totals.html:22 -#: amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:16 -#: templates/basis.html:141 templates/basis.html:228 +#: amelie/activities/forms.py:242 amelie/activities/models.py:82 amelie/activities/models.py:83 amelie/activities/templates/activity_list.html:4 amelie/activities/templates/activity_list.html:35 amelie/activities/templates/activity_list.html:106 amelie/activities/templates/activity_old.html:4 amelie/activities/templates/activity_old.html:34 amelie/calendar/models.py:27 amelie/calendar/models.py:124 amelie/calendar/models.py:125 amelie/companies/templates/companies/company_event_list.html:4 amelie/companies/templates/companies/company_event_old.html:34 amelie/personal_tab/models.py:179 amelie/personal_tab/statistics.py:285 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:14 amelie/personal_tab/templates/cookie_corner_statistics.html:182 amelie/personal_tab/templates/cookie_corner_statistics.html:190 amelie/personal_tab/templates/cookie_corner_transactions_new.html:42 amelie/personal_tab/templates/lists/activity_transactions.html:11 amelie/personal_tab/templates/lists/transactions_totals.html:22 amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:16 templates/basis.html:141 templates/basis.html:228 msgid "Activities" msgstr "Activiteiten" -#: amelie/activities/forms.py:243 amelie/calendar/models.py:110 -#: amelie/education/models.py:257 amelie/education/models.py:285 -#: amelie/education/templates/education_event_overview.html:18 -#: amelie/oauth/forms.py:11 amelie/videos/models.py:19 +#: amelie/activities/forms.py:243 amelie/calendar/models.py:110 amelie/education/models.py:257 amelie/education/models.py:285 amelie/education/templates/education_event_overview.html:18 amelie/oauth/forms.py:11 amelie/videos/models.py:19 msgid "Public" msgstr "Publiek" @@ -309,38 +186,100 @@ msgstr "Publiek" msgid "Photos are also available without logging in" msgstr "Foto's zijn ook beschikbaar zonder in te loggen" -#: amelie/activities/forms.py:245 -#: amelie/activities/templates/activity_list.html:107 -#: amelie/activities/templates/activity_old.html:35 -#: amelie/activities/templates/gallery.html:4 -#: amelie/activities/templates/gallery.html:9 -#: amelie/activities/templates/gallery_overview.html:4 -#: amelie/activities/templates/gallery_overview.html:34 -#: amelie/activities/templates/gallery_overview.html:201 -#: amelie/activities/templates/gallery_photo.html:4 -#: amelie/activities/templates/gallery_photo.html:13 -#: amelie/activities/templates/includes/activity_list_photos.html:4 -#: amelie/activities/templates/photo_upload.html:26 -#: amelie/companies/templates/companies/company_event_old.html:35 -#: amelie/statistics/templates/statistics.html:48 +#: amelie/activities/forms.py:245 amelie/activities/templates/activity_list.html:107 amelie/activities/templates/activity_old.html:35 amelie/activities/templates/gallery.html:4 amelie/activities/templates/gallery.html:9 amelie/activities/templates/gallery_overview.html:4 amelie/activities/templates/gallery_overview.html:34 amelie/activities/templates/gallery_overview.html:201 amelie/activities/templates/gallery_photo.html:4 amelie/activities/templates/gallery_photo.html:13 amelie/activities/templates/includes/activity_list_photos.html:4 amelie/activities/templates/photo_upload.html:26 amelie/companies/templates/companies/company_event_old.html:35 amelie/statistics/templates/statistics.html:48 msgid "Photos" msgstr "Foto's" -#: amelie/activities/forms.py:266 +#: amelie/activities/forms.py:284 #, python-format -msgid "" -"File extension “%(extension)s” is not allowed. Allowed extensions are: " -"%(allowed_extensions)s." -msgstr "" -"Bestandsextensie \"%(extension)s\" is niet toegestaan. Toegestane " -"bestandsextensies zijn: %(allowed_extensions)s." +msgid "File extension “%(extension)s” is not allowed. Allowed extensions are: %(allowed_extensions)s." +msgstr "Bestandsextensie \"%(extension)s\" is niet toegestaan. Toegestane bestandsextensies zijn: %(allowed_extensions)s." -#: amelie/activities/forms.py:276 -#: amelie/activities/templates/activities/eventdesk/message_list.html:70 -#: amelie/activities/templates/activities/eventdesk/message_list.html:102 +#: amelie/activities/forms.py:294 amelie/activities/templates/activities/eventdesk/message_list.html:70 amelie/activities/templates/activities/eventdesk/message_list.html:102 msgid "Activity" msgstr "Activiteit" +#: amelie/activities/graphql.py:58 +msgid "The absolute URL to an activity." +msgstr "De directe link naar de URL van deze activiteit." + +#: amelie/activities/graphql.py:59 +msgid "A URL to a random picture that was made at this activity." +msgstr "Een URL van een willekeurige foto die gemaakt is op deze activiteit." + +#: amelie/activities/graphql.py:60 +msgid "A URL that points to the picture gallery for this activity." +msgstr "Een URL die naar de foto gallerij van deze activiteit wijst." + +#: amelie/activities/graphql.py:61 +#| msgid "You cannot enroll for this activity" +msgid "A link to the ICS file for this activity." +msgstr "Een link naar het ICS bestand voor deze activiteit." + +#: amelie/activities/graphql.py:62 +#| msgid "You cannot enroll for this activity" +msgid "Whether people can still enroll for this activity." +msgstr "Of mensen zich nog kunnen inschrijven voor deze activiteit." + +#: amelie/activities/graphql.py:63 +#| msgid "You cannot enroll for this activity" +msgid "Whether people can no longer enroll for this activity." +msgstr "Of mensen zich niet langer kunnen inschrijven voor deze activiteit." + +#: amelie/activities/graphql.py:64 +msgid "Whether the person that is currently signed-in can edit this activity." +msgstr "Of de persoon die nu is ingelogd deze activeit kan bewerken." + +#: amelie/activities/graphql.py:65 +#| msgid "The type of export that was made." +msgid "The amount of open spots that are still available." +msgstr "Hoeveel plekken er nog vrij zijn." + +#: amelie/activities/graphql.py:66 +#| msgid "The enrollment for this activity is full" +msgid "Whether this activity is full." +msgstr "Of deze activiteit vol is." + +#: amelie/activities/graphql.py:67 +msgid "Whether this activity has any participations that are on the waiting list." +msgstr "Of deze activiteit inschrijvingen op de wachtlijst heeft staan." + +#: amelie/activities/graphql.py:68 +#| msgid "" +#| "\n" +#| "For this activity, there is one place left." +#| msgid_plural "" +#| "\n" +#| "For this activity there are %(places)s places left." +msgid "Whether this activity is almost full (<= 10 places left)." +msgstr "Of deze activiteit bijna vol is (<= 10 plekken over)." + +#: amelie/activities/graphql.py:69 +#| msgid "There are currently no pre-enrollments." +msgid "If there are any options for enrollments." +msgstr "Of er inschrijf mogelijkheden zijn." + +#: amelie/activities/graphql.py:70 +#| msgid "There are no messages for this activity" +msgid "If there are any costs associated with this activity." +msgstr "Of er kosten vastzitten aan deze activiteit." + +#: amelie/activities/graphql.py:71 +msgid "A summary of this activity in the preferred language of this user." +msgstr "Een samenvatting van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/activities/graphql.py:72 +msgid "A description of this activity in the preferred language of this user." +msgstr "Een beschrijving van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/activities/graphql.py:73 +msgid "Promotional text for this activity in the preferred language of this user." +msgstr "Een promo tekst van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/activities/graphql.py:74 +msgid "A brief description of this activity (always in english)." +msgstr "Een korte beschrijving van deze activiteit (altijd in het Engels)" + #: amelie/activities/models.py:27 msgid "Hexcolor without #" msgstr "Hex kleurcode (zonder #)" @@ -357,9 +296,7 @@ msgstr "Uitleg over icoon (en)" msgid "Explanation on icon" msgstr "Uitleg over icoon" -#: amelie/activities/models.py:31 -#: amelie/companies/templates/companies/company_statistics.html:75 -#: amelie/companies/templates/companies/company_statistics.html:105 +#: amelie/activities/models.py:31 amelie/companies/templates/companies/company_statistics.html:75 amelie/companies/templates/companies/company_statistics.html:105 msgid "Active?" msgstr "Actief?" @@ -372,12 +309,8 @@ msgid "enrollment start" msgstr "inschrijving start" #: amelie/activities/models.py:59 -msgid "" -"If you want to add options, make sure your activity isn't open for " -"enrollment right away" -msgstr "" -"Als je nog opties wil toevoegen, zorg ervoor dat de inschrijving dan niet " -"meteen open is" +msgid "If you want to add options, make sure your activity isn't open for enrollment right away" +msgstr "Als je nog opties wil toevoegen, zorg ervoor dat de inschrijving dan niet meteen open is" #: amelie/activities/models.py:60 msgid "enrollment end" @@ -407,18 +340,7 @@ msgstr "Afbeelding van 175 bij 275 pixels." msgid "Facebook event id, numerical value in the facebook event url." msgstr "Facebook event id, numerieke waarde in de facebook event url." -#: amelie/activities/models.py:219 -#: amelie/activities/templates/activities/enrollmentoption_list.html:41 -#: amelie/activities/templates/activities/enrollmentoption_list.html:87 -#: amelie/activities/templates/activities/enrollmentoption_list.html:135 -#: amelie/activities/templates/activities/enrollmentoption_list.html:177 -#: amelie/members/templates/includes/query/query_push.html:51 -#: amelie/news/templates/news_item_form.html:17 -#: amelie/publications/templates/publications/publication_form.html:31 -#: amelie/room_duty/models.py:38 amelie/room_duty/models.py:163 -#: amelie/videos/templates/videos/ia_video_form.html:54 -#: amelie/videos/templates/videos/yt_video_form.html:54 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:22 +#: amelie/activities/models.py:219 amelie/activities/templates/activities/enrollmentoption_list.html:41 amelie/activities/templates/activities/enrollmentoption_list.html:87 amelie/activities/templates/activities/enrollmentoption_list.html:135 amelie/activities/templates/activities/enrollmentoption_list.html:177 amelie/members/templates/includes/query/query_push.html:51 amelie/news/templates/news_item_form.html:17 amelie/publications/templates/publications/publication_form.html:31 amelie/room_duty/models.py:38 amelie/room_duty/models.py:163 amelie/videos/templates/videos/ia_video_form.html:54 amelie/videos/templates/videos/yt_video_form.html:54 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:22 msgid "Title" msgstr "Titel" @@ -426,21 +348,15 @@ msgstr "Titel" msgid "Enrollment option" msgstr "Inschrijfoptie" -#: amelie/activities/models.py:226 -#: amelie/activities/templates/activities/enrollmentoption_list.html:5 -#: amelie/activities/templates/activity_enrollment_form.html:47 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:39 +#: amelie/activities/models.py:226 amelie/activities/templates/activities/enrollmentoption_list.html:5 amelie/activities/templates/activity_enrollment_form.html:47 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:39 msgid "Enrollment options" msgstr "Inschrijfopties" -#: amelie/activities/models.py:267 amelie/activities/models.py:477 -#: amelie/activities/templates/activities/enrollmentoption_list.html:136 -#: amelie/activities/templates/activities/enrollmentoption_list.html:178 +#: amelie/activities/models.py:267 amelie/activities/models.py:477 amelie/activities/templates/activities/enrollmentoption_list.html:136 amelie/activities/templates/activities/enrollmentoption_list.html:178 msgid "Required" msgstr "Verplicht" -#: amelie/activities/models.py:280 amelie/activities/models.py:306 -#: amelie/activities/models.py:343 +#: amelie/activities/models.py:280 amelie/activities/models.py:306 amelie/activities/models.py:343 msgid "Price extra" msgstr "Prijs extra" @@ -448,8 +364,7 @@ msgstr "Prijs extra" msgid "Maximum limit of selections" msgstr "Limiet van selecties" -#: amelie/activities/models.py:281 amelie/activities/models.py:307 -#: amelie/activities/models.py:308 +#: amelie/activities/models.py:281 amelie/activities/models.py:307 amelie/activities/models.py:308 msgid "Set as 0 for unlimited" msgstr "Houd op 0 voor onbeperkt" @@ -465,9 +380,7 @@ msgstr "Inschrijfoptieantwoord" msgid "Anwers to enrollment option" msgstr "Inschrijfoptieantwoorden" -#: amelie/activities/models.py:402 amelie/activities/models.py:415 -#: amelie/activities/models.py:430 amelie/activities/models.py:442 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:47 +#: amelie/activities/models.py:402 amelie/activities/models.py:415 amelie/activities/models.py:430 amelie/activities/models.py:442 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:47 msgid "Respons" msgstr "Antwoord" @@ -475,37 +388,11 @@ msgstr "Antwoord" msgid "A response is required" msgstr "Antwoord is verplicht" -#: amelie/activities/models.py:420 -#: amelie/activities/templates/activities/eventdesk/message_list.html:212 -#: amelie/activities/templates/activity_confirm_delete.html:21 -#: amelie/activities/templates/activity_confirm_unenrollment.html:19 -#: amelie/activities/templates/forms/enrollmentoption_checkbox_answer.html:18 -#: amelie/activities/templates/photo_upload_clear_confirm.html:25 -#: amelie/calendar/templates/confirm_payment.html:19 -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:21 -#: amelie/claudia/templates/claudia/confirm_add.html:21 -#: amelie/claudia/templates/claudia/confirm_delete.html:21 -#: amelie/companies/templates/companies/company_confirm_delete.html:19 -#: amelie/education/templates/education_event_delete.html:19 -#: amelie/members/templates/members/datablock_html.mail:26 -#: amelie/members/templates/preregistration_delete_confirm.html:17 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_confirm_delete.html:16 +#: amelie/activities/models.py:420 amelie/activities/templates/activities/eventdesk/message_list.html:212 amelie/activities/templates/activity_confirm_delete.html:21 amelie/activities/templates/activity_confirm_unenrollment.html:19 amelie/activities/templates/forms/enrollmentoption_checkbox_answer.html:18 amelie/activities/templates/photo_upload_clear_confirm.html:25 amelie/calendar/templates/confirm_payment.html:19 amelie/claudia/templates/claudia/add_to_mapping_confirm.html:21 amelie/claudia/templates/claudia/confirm_add.html:21 amelie/claudia/templates/claudia/confirm_delete.html:21 amelie/companies/templates/companies/company_confirm_delete.html:19 amelie/education/templates/education_event_delete.html:19 amelie/members/templates/members/datablock_html.mail:26 amelie/members/templates/preregistration_delete_confirm.html:17 amelie/weekmail/templates/weekmail/weekmailnewsarticle_confirm_delete.html:16 msgid "Yes" msgstr "Ja" -#: amelie/activities/models.py:420 -#: amelie/activities/templates/activities/eventdesk/message_list.html:215 -#: amelie/activities/templates/activity_confirm_delete.html:22 -#: amelie/activities/templates/activity_confirm_unenrollment.html:20 -#: amelie/activities/templates/photo_upload_clear_confirm.html:26 -#: amelie/calendar/templates/confirm_payment.html:20 -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:22 -#: amelie/claudia/templates/claudia/confirm_add.html:22 -#: amelie/claudia/templates/claudia/confirm_delete.html:22 -#: amelie/companies/templates/companies/company_confirm_delete.html:20 -#: amelie/education/templates/education_event_delete.html:20 -#: amelie/members/templates/members/datablock_html.mail:26 -#: amelie/members/templates/preregistration_delete_confirm.html:18 +#: amelie/activities/models.py:420 amelie/activities/templates/activities/eventdesk/message_list.html:215 amelie/activities/templates/activity_confirm_delete.html:22 amelie/activities/templates/activity_confirm_unenrollment.html:20 amelie/activities/templates/photo_upload_clear_confirm.html:26 amelie/calendar/templates/confirm_payment.html:20 amelie/claudia/templates/claudia/add_to_mapping_confirm.html:22 amelie/claudia/templates/claudia/confirm_add.html:22 amelie/claudia/templates/claudia/confirm_delete.html:22 amelie/companies/templates/companies/company_confirm_delete.html:20 amelie/education/templates/education_event_delete.html:20 amelie/members/templates/members/datablock_html.mail:26 amelie/members/templates/preregistration_delete_confirm.html:18 msgid "No" msgstr "Nee" @@ -517,13 +404,11 @@ msgstr "(geen)" msgid "Restaurant" msgstr "Restaurant" -#: amelie/activities/models.py:466 amelie/personal_tab/models.py:287 -#: amelie/personal_tab/models.py:321 amelie/room_duty/models.py:242 +#: amelie/activities/models.py:466 amelie/personal_tab/models.py:287 amelie/personal_tab/models.py:321 amelie/room_duty/models.py:242 msgid "Available" msgstr "Beschikbaar" -#: amelie/activities/models.py:467 -#: amelie/activities/templates/forms/enrollmentoption_foodquestion_answer.html:35 +#: amelie/activities/models.py:467 amelie/activities/templates/forms/enrollmentoption_foodquestion_answer.html:35 msgid "Allergens" msgstr "Allergiën" @@ -539,22 +424,15 @@ msgstr "Inschrijfoptievraag" msgid "Dish cost" msgstr "Prijs voor gerecht" -#: amelie/activities/models.py:537 -#: amelie/activities/templates/activities/eventdesk/message_list.html:51 -#: amelie/personal_tab/templates/info/rfid_cards.html:15 +#: amelie/activities/models.py:537 amelie/activities/templates/activities/eventdesk/message_list.html:51 amelie/personal_tab/templates/info/rfid_cards.html:15 msgid "Registered" msgstr "Aangemeld" -#: amelie/activities/models.py:538 -#: amelie/activities/templates/activities/eventdesk/message_list.html:55 +#: amelie/activities/models.py:538 amelie/activities/templates/activities/eventdesk/message_list.html:55 msgid "Accepted" msgstr "Geaccepteerd" -#: amelie/activities/models.py:539 amelie/activities/views.py:1347 -#: amelie/activities/views.py:1353 amelie/activities/views.py:1359 -#: amelie/members/models.py:287 -#: amelie/personal_tab/templates/info/rfid_cards.html:45 -#: templates/profile_overview.html:213 +#: amelie/activities/models.py:539 amelie/activities/views.py:1347 amelie/activities/views.py:1353 amelie/activities/views.py:1359 amelie/members/models.py:287 amelie/personal_tab/templates/info/rfid_cards.html:45 templates/profile_overview.html:213 msgid "Unknown" msgstr "Onbekend" @@ -607,86 +485,43 @@ msgstr "{0:.1f}% zeker" msgid "Confirmation of enrollment" msgstr "Bevestiging voor inschrijving activiteit" -#: amelie/activities/templates/activities/activity_enrolled.mail:5 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:5 -#: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:5 -#: amelie/claudia/templates/accounts/password_reset.mail:5 -#: amelie/claudia/templates/claudia/account_created.mail:5 -#: amelie/data_export/templates/data_export/mails/export_complete.mail:5 -#: amelie/education/templates/education/complaint_closed.mail:10 -#: amelie/members/templates/members/datamail_html.mail:2 -#: amelie/members/templates/members/preregistration_welcome.mail:6 -#: amelie/members/templates/members/verification_reminder.mail:6 -#: amelie/members/templates/members/yeartransfer_ended.mail:6 -#: amelie/members/templates/members/yeartransfer_ended_eniac.mail:6 -#: amelie/members/templates/members/yeartransfer_ended_final.mail:6 -#: amelie/members/templates/members/yeartransfer_prolonged.mail:6 -#: amelie/tools/templates/send_oauth_link_code.mail:6 -#: amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:1 +#: amelie/activities/templates/activities/activity_enrolled.mail:5 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:5 amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:5 amelie/claudia/templates/accounts/password_reset.mail:5 amelie/claudia/templates/claudia/account_created.mail:5 amelie/data_export/templates/data_export/mails/export_complete.mail:5 amelie/education/templates/education/complaint_closed.mail:10 amelie/members/templates/members/datamail_html.mail:2 amelie/members/templates/members/preregistration_welcome.mail:6 amelie/members/templates/members/verification_reminder.mail:6 amelie/members/templates/members/yeartransfer_ended.mail:6 amelie/members/templates/members/yeartransfer_ended_eniac.mail:6 amelie/members/templates/members/yeartransfer_ended_final.mail:6 amelie/members/templates/members/yeartransfer_prolonged.mail:6 amelie/tools/templates/send_oauth_link_code.mail:6 amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:1 msgid "Dear" msgstr "Beste" #: amelie/activities/templates/activities/activity_enrolled.mail:7 #, python-format -msgid "" -"You receive this email because you have been enrolled for %(summary)s. This " -"activity starts at %(begindate)s hour on %(begintime)s." -msgstr "" -"Je ontvangt deze e-mail omdat je bent ingeschreven voor %(summary)s. Deze " -"activiteit begint op %(begindate)s om %(begintime)s uur." +msgid "You receive this email because you have been enrolled for %(summary)s. This activity starts at %(begindate)s hour on %(begintime)s." +msgstr "Je ontvangt deze e-mail omdat je bent ingeschreven voor %(summary)s. Deze activiteit begint op %(begindate)s om %(begintime)s uur." -#: amelie/activities/templates/activities/activity_enrolled.mail:9 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:9 +#: amelie/activities/templates/activities/activity_enrolled.mail:9 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:9 #, python-format msgid "The total costs are %(costs)s euro. Payment method: %(paymentmethod)s." msgstr "De kosten zijn totaal %(costs)s euro. Betaalwijze: %(paymentmethod)s." -#: amelie/activities/templates/activities/activity_enrolled.mail:11 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:11 +#: amelie/activities/templates/activities/activity_enrolled.mail:11 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:11 msgid "For this activity, the following enrollment options exist:" msgstr "Bij deze activiteit zijn de volgende inschrijfopties ingevuld:" -#: amelie/activities/templates/activities/activity_enrolled.mail:21 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:21 +#: amelie/activities/templates/activities/activity_enrolled.mail:21 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:21 #, python-format -msgid "" -"It's possible to edit your enrollment or unenroll until %(enrollment_end)s." -msgstr "" -"Tot %(enrollment_end)s is het mogelijk om je inschrijving te wijzigen of te " -"annuleren." +msgid "It's possible to edit your enrollment or unenroll until %(enrollment_end)s." +msgstr "Tot %(enrollment_end)s is het mogelijk om je inschrijving te wijzigen of te annuleren." -#: amelie/activities/templates/activities/activity_enrolled.mail:23 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:23 -msgid "" -"For this activity, you can only unenroll yourself by contacting the board." -msgstr "" -"Voor deze activiteit kun je jezelf alleen uitschrijven indien je contact met " -"het bestuur opneemt." +#: amelie/activities/templates/activities/activity_enrolled.mail:23 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:23 +msgid "For this activity, you can only unenroll yourself by contacting the board." +msgstr "Voor deze activiteit kun je jezelf alleen uitschrijven indien je contact met het bestuur opneemt." -#: amelie/activities/templates/activities/activity_enrolled.mail:25 -#: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:11 +#: amelie/activities/templates/activities/activity_enrolled.mail:25 amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:11 #, python-format -msgid "" -"You have been enrolled by %(enrolled_by)s. In case you did not approve this, " -"get in touch with the board." -msgstr "" -"Je bent ingeschreven door %(enrolled_by)s. Indien je hier geen toestemming " -"voor gegeven hebt, neem dan contact op met het bestuur." +msgid "You have been enrolled by %(enrolled_by)s. In case you did not approve this, get in touch with the board." +msgstr "Je bent ingeschreven door %(enrolled_by)s. Indien je hier geen toestemming voor gegeven hebt, neem dan contact op met het bestuur." -#: amelie/activities/templates/activities/activity_enrolled.mail:27 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:25 -#: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:13 -msgid "" -"An invite is attached. You can import this in your agenda. In case you no " -"longer want to receive invites through e-mail, edit your preferences on the " -"website." -msgstr "" -"In de bijlage is een invite toegevoegd. Deze is te importeren in je agenda. " -"Wil je geen invite meer ontvangen in de e-mail, wijzig dan je voorkeuren op " -"de website." +#: amelie/activities/templates/activities/activity_enrolled.mail:27 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:25 amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:13 +msgid "An invite is attached. You can import this in your agenda. In case you no longer want to receive invites through e-mail, edit your preferences on the website." +msgstr "In de bijlage is een invite toegevoegd. Deze is te importeren in je agenda. Wil je geen invite meer ontvangen in de e-mail, wijzig dan je voorkeuren op de website." -#: amelie/activities/templates/activities/activity_enrolled.mail:29 -#: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:27 +#: amelie/activities/templates/activities/activity_enrolled.mail:29 amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:27 msgid "" "See you then!\n" "\n" @@ -702,14 +537,8 @@ msgstr "Ingeschreven vanuit wachtlijst" #: amelie/activities/templates/activities/activity_enrolled_from_waiting_list.mail:7 #, python-format -msgid "" -"You receive this email because you have been enrolled for %(summary)s and " -"are no longer on the waiting list. This activity starts at %(begindate)s " -"hour on %(begintime)s." -msgstr "" -"Je ontvangt deze e-mail omdat je bent ingeschreven voor %(summary)s en je " -"niet langer op de wachtlijst staat. Deze activiteit begint op %(begindate)s " -"om %(begintime)s uur." +msgid "You receive this email because you have been enrolled for %(summary)s and are no longer on the waiting list. This activity starts at %(begindate)s hour on %(begintime)s." +msgstr "Je ontvangt deze e-mail omdat je bent ingeschreven voor %(summary)s en je niet langer op de wachtlijst staat. Deze activiteit begint op %(begindate)s om %(begintime)s uur." #: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:3 msgid "Confirmation of enrollment on waiting list" @@ -717,12 +546,8 @@ msgstr "Bevestiging voor inschrijving op wachtlijst voor activiteit" #: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:7 #, python-format -msgid "" -"You receive this email because you have been enrolled on the waiting list " -"for %(summary)s. This activity starts at %(begindate)s hour on %(begintime)s." -msgstr "" -"Je ontvangt deze e-mail omdat je bent ingeschreven op de wachtlijst voor " -"%(summary)s. Deze activiteit begint op %(begindate)s om %(begintime)s uur." +msgid "You receive this email because you have been enrolled on the waiting list for %(summary)s. This activity starts at %(begindate)s hour on %(begintime)s." +msgstr "Je ontvangt deze e-mail omdat je bent ingeschreven op de wachtlijst voor %(summary)s. Deze activiteit begint op %(begindate)s om %(begintime)s uur." #: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:9 msgid "Please note: you are on the waiting list for this activity; " @@ -737,12 +562,8 @@ msgid "there is no spot available yet" msgstr "er is nog geen plek beschikbaar" #: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:9 -msgid "" -"If a spot becomes available, you will be enrolled automatically and receive " -"another email." -msgstr "" -"Als een plek beschikbaar komt, zal je automatisch ingeschreven worden en een " -"mail ontvangen." +msgid "If a spot becomes available, you will be enrolled automatically and receive another email." +msgstr "Als een plek beschikbaar komt, zal je automatisch ingeschreven worden en een mail ontvangen." #: amelie/activities/templates/activities/activity_enrolled_on_waiting_list.mail:15 msgid "" @@ -752,38 +573,24 @@ msgstr "" "\n" "Met vriendelijke groet," -#: amelie/activities/templates/activities/activity_form.html:6 -#: amelie/activities/templates/activities/activity_form.html:17 -#: amelie/activities/templates/activity_list.html:87 -#: amelie/companies/templates/companies/company_event_form.html:6 -#: amelie/companies/templates/companies/company_event_form.html:17 -#: amelie/companies/templates/companies/company_event_list.html:59 -#: amelie/education/templates/education_event_form.html:21 -#: amelie/education/templates/education_event_overview.html:51 +#: amelie/activities/templates/activities/activity_form.html:6 amelie/activities/templates/activities/activity_form.html:17 amelie/activities/templates/activity_list.html:87 amelie/companies/templates/companies/company_event_form.html:6 amelie/companies/templates/companies/company_event_form.html:17 amelie/companies/templates/companies/company_event_list.html:59 amelie/education/templates/education_event_form.html:21 amelie/education/templates/education_event_overview.html:51 msgid "Add event" msgstr "Activiteit toevoegen" -#: amelie/activities/templates/activities/activity_form.html:8 -#: amelie/activities/templates/activities/activity_form.html:17 -#: amelie/companies/templates/companies/company_event_form.html:8 +#: amelie/activities/templates/activities/activity_form.html:8 amelie/activities/templates/activities/activity_form.html:17 amelie/companies/templates/companies/company_event_form.html:8 msgid "Edit this event" msgstr "Activiteit wijzigen" #: amelie/activities/templates/activities/activity_form.html:25 msgid "" "\n" -" Warning: This activity already has " -"participants.\n" -" It is therefore impossible to add or alter " -"options for enrollment.\n" -" Changing prices and/or texts will only " -"influence people who have yet to enroll!\n" +" Warning: This activity already has participants.\n" +" It is therefore impossible to add or alter options for enrollment.\n" +" Changing prices and/or texts will only influence people who have yet to enroll!\n" " " msgstr "" "\n" -"Let op: Activiteit heeft al deelnemers. Het is daarom niet mogelijk " -"inschrijfopties toe te voegen of te verwijderen. Wijzigen van prijzen en/of " -"hebben alleen invloed op de mensen die zich nog gaan inschrijven!" +"Let op: Activiteit heeft al deelnemers. Het is daarom niet mogelijk inschrijfopties toe te voegen of te verwijderen. Wijzigen van prijzen en/of hebben alleen invloed op de mensen die zich nog gaan inschrijven!" #: amelie/activities/templates/activities/activity_form.html:57 msgid "Promotional text:" @@ -796,63 +603,15 @@ msgstr "Volledige beschrijving" #: amelie/activities/templates/activities/activity_form.html:91 msgid "" "\n" -" When you save this new event, it will " -"immediately be announced to our Discord server and\n" -" to our IRC channel. Please make sure all entered " -"details are correct and that you added at\n" -" least a brief summary, and not just More info " -"will follow....\n" +" When you save this new event, it will immediately be announced to our Discord server and\n" +" to our IRC channel. Please make sure all entered details are correct and that you added at\n" +" least a brief summary, and not just More info will follow....\n" " " msgstr "" "\n" -"Als je deze nieuwe activiteit opslaat, zal deze direct worden aangekondigd " -"op onze Discord-server en op ons IRC-kanaal. Kijk alsjeblieft nog een keer " -"of alle details kloppen en dat je in ieder geval een korte samenvatting van " -"de activiteit hebt ingevuld, en niet iets als Meer informatie volgt...." - -#: amelie/activities/templates/activities/activity_form.html:99 -#: amelie/activities/templates/activities/enrollmentoption_form.html:35 -#: amelie/activities/templates/activities/eventdesk/match.html:86 -#: amelie/claudia/templates/accounts/mailing_alias.html:21 -#: amelie/claudia/templates/claudia/aliasgroup_form.html:18 -#: amelie/claudia/templates/claudia/contact_form.html:18 -#: amelie/claudia/templates/claudia/extragroup_form.html:18 -#: amelie/claudia/templates/claudia/extraperson_form.html:18 -#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:18 -#: amelie/claudia/templates/claudia/shareddrive_form.html:18 -#: amelie/companies/templates/companies/company_event_form.html:107 -#: amelie/education/templates/complaint_new.html:132 -#: amelie/education/templates/course_new.html:41 -#: amelie/education/templates/education_event_form.html:70 -#: amelie/education/templates/module_new.html:34 -#: amelie/members/templates/committee_edit_data.html:11 -#: amelie/members/templates/committee_edit_members.html:76 -#: amelie/members/templates/committee_edit_single_member.html:69 -#: amelie/members/templates/person_edit_data.html:20 -#: amelie/members/templates/person_edit_employee.html:16 -#: amelie/members/templates/person_edit_functions.html:60 -#: amelie/members/templates/person_edit_preferences.html:20 -#: amelie/members/templates/person_edit_study.html:51 -#: amelie/members/templates/person_end_mandate.html:14 -#: amelie/members/templates/person_end_membership.html:19 -#: amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:20 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:19 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:23 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:37 -#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:60 -#: amelie/room_duty/templates/room_duty/pool/form.html:18 -#: amelie/room_duty/templates/room_duty/table/change.html:15 -#: amelie/room_duty/templates/room_duty/table/change.html:26 -#: amelie/room_duty/templates/room_duty/table/fill.html:56 -#: amelie/room_duty/templates/room_duty/table/form.html:57 -#: amelie/room_duty/templates/room_duty/table/overview.html:148 -#: amelie/room_duty/templates/room_duty/table/room_duty_add.html:15 -#: amelie/room_duty/templates/room_duty/template/add.html:18 -#: amelie/room_duty/templates/room_duty/template/change.html:15 -#: amelie/room_duty/templates/room_duty/template/change.html:26 -#: amelie/room_duty/templates/room_duty/template/room_duty_add.html:15 -#: templates/profile_edit.html:96 templates/profile_edit.html:104 +"Als je deze nieuwe activiteit opslaat, zal deze direct worden aangekondigd op onze Discord-server en op ons IRC-kanaal. Kijk alsjeblieft nog een keer of alle details kloppen en dat je in ieder geval een korte samenvatting van de activiteit hebt ingevuld, en niet iets als Meer informatie volgt...." + +#: amelie/activities/templates/activities/activity_form.html:99 amelie/activities/templates/activities/enrollmentoption_form.html:35 amelie/activities/templates/activities/eventdesk/match.html:86 amelie/claudia/templates/accounts/mailing_alias.html:21 amelie/claudia/templates/claudia/aliasgroup_form.html:18 amelie/claudia/templates/claudia/contact_form.html:18 amelie/claudia/templates/claudia/extragroup_form.html:18 amelie/claudia/templates/claudia/extraperson_form.html:18 amelie/claudia/templates/claudia/extrapersonalalias_form.html:18 amelie/claudia/templates/claudia/shareddrive_form.html:18 amelie/companies/templates/companies/company_event_form.html:107 amelie/education/templates/complaint_new.html:132 amelie/education/templates/course_new.html:41 amelie/education/templates/education_event_form.html:70 amelie/education/templates/module_new.html:34 amelie/members/templates/committee_edit_data.html:11 amelie/members/templates/committee_edit_members.html:76 amelie/members/templates/committee_edit_single_member.html:69 amelie/members/templates/person_edit_data.html:20 amelie/members/templates/person_edit_employee.html:16 amelie/members/templates/person_edit_functions.html:60 amelie/members/templates/person_edit_preferences.html:20 amelie/members/templates/person_edit_study.html:51 amelie/members/templates/person_end_mandate.html:14 amelie/members/templates/person_end_membership.html:19 amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:20 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:19 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:23 amelie/personal_tab/templates/cookie_corner_process_batch.html:37 amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:60 amelie/room_duty/templates/room_duty/pool/form.html:18 amelie/room_duty/templates/room_duty/table/change.html:15 amelie/room_duty/templates/room_duty/table/change.html:26 amelie/room_duty/templates/room_duty/table/fill.html:56 amelie/room_duty/templates/room_duty/table/form.html:57 amelie/room_duty/templates/room_duty/table/overview.html:148 amelie/room_duty/templates/room_duty/table/room_duty_add.html:15 amelie/room_duty/templates/room_duty/template/add.html:18 amelie/room_duty/templates/room_duty/template/change.html:15 amelie/room_duty/templates/room_duty/template/change.html:26 amelie/room_duty/templates/room_duty/template/room_duty_add.html:15 templates/profile_edit.html:96 templates/profile_edit.html:104 msgid "Save" msgstr "Opslaan" @@ -860,50 +619,11 @@ msgstr "Opslaan" msgid "Save and add enrollment options" msgstr "Opslaan en inschrijfopties toevoegen" -#: amelie/activities/templates/activities/activity_form.html:104 -#: amelie/activities/templates/activities/activity_form.html:107 -#: amelie/activities/templates/activities/enrollmentoption_confirm_delete.html:21 -#: amelie/activities/templates/activity_enrollment_form.html:107 -#: amelie/claudia/templates/accounts/mailing_alias.html:18 -#: amelie/claudia/templates/claudia/extrapersonalalias_delete.html:21 -#: amelie/companies/templates/companies/company_event_form.html:111 -#: amelie/companies/templates/companies/company_event_form.html:113 -#: amelie/education/templates/education_event_form.html:74 -#: amelie/education/templates/education_event_form.html:76 -#: amelie/members/templates/committee_edit_data.html:8 -#: amelie/members/templates/committee_edit_members.html:73 -#: amelie/members/templates/committee_edit_single_member.html:66 -#: amelie/members/templates/members/payment_confirm_delete.html:21 -#: amelie/members/templates/person_activate_mandate.html:19 -#: amelie/members/templates/person_edit_data.html:17 -#: amelie/members/templates/person_edit_employee.html:9 -#: amelie/members/templates/person_edit_functions.html:57 -#: amelie/members/templates/person_edit_preferences.html:17 -#: amelie/members/templates/person_edit_study.html:48 -#: amelie/members/templates/person_edit_studyperiod.html:12 -#: amelie/members/templates/person_end_mandate.html:11 -#: amelie/members/templates/person_end_membership.html:16 -#: amelie/members/templates/person_new_mandate.html:11 -#: amelie/members/templates/person_new_membership.html:11 -#: amelie/members/templates/person_payment.html:15 -#: amelie/personal_tab/templates/cookie_corner/transaction_delete.html:16 -#: amelie/personal_tab/templates/pos/register_external_card.html:40 -#: amelie/personal_tab/templates/pos/scan_external_card.html:27 -#: amelie/room_duty/templates/room_duty/balcony_duty/delete.html:17 -#: amelie/room_duty/templates/room_duty/pool/delete.html:38 -#: amelie/room_duty/templates/room_duty/pool/form.html:17 -#: amelie/room_duty/templates/room_duty/table/delete.html:18 -#: amelie/room_duty/templates/room_duty/table/form.html:56 -#: amelie/room_duty/templates/room_duty/table/room_duty_delete.html:26 -#: amelie/room_duty/templates/room_duty/template/add.html:17 -#: amelie/room_duty/templates/room_duty/template/delete.html:18 -#: templates/oauth2_provider/authorize.html:35 +#: amelie/activities/templates/activities/activity_form.html:104 amelie/activities/templates/activities/activity_form.html:107 amelie/activities/templates/activities/enrollmentoption_confirm_delete.html:21 amelie/activities/templates/activity_enrollment_form.html:107 amelie/claudia/templates/accounts/mailing_alias.html:18 amelie/claudia/templates/claudia/extrapersonalalias_delete.html:21 amelie/companies/templates/companies/company_event_form.html:111 amelie/companies/templates/companies/company_event_form.html:113 amelie/education/templates/education_event_form.html:74 amelie/education/templates/education_event_form.html:76 amelie/members/templates/committee_edit_data.html:8 amelie/members/templates/committee_edit_members.html:73 amelie/members/templates/committee_edit_single_member.html:66 amelie/members/templates/members/payment_confirm_delete.html:21 amelie/members/templates/person_activate_mandate.html:19 amelie/members/templates/person_edit_data.html:17 amelie/members/templates/person_edit_employee.html:9 amelie/members/templates/person_edit_functions.html:57 amelie/members/templates/person_edit_preferences.html:17 amelie/members/templates/person_edit_study.html:48 amelie/members/templates/person_edit_studyperiod.html:12 amelie/members/templates/person_end_mandate.html:11 amelie/members/templates/person_end_membership.html:16 amelie/members/templates/person_new_mandate.html:11 amelie/members/templates/person_new_membership.html:11 amelie/members/templates/person_payment.html:15 amelie/personal_tab/templates/cookie_corner/transaction_delete.html:16 amelie/personal_tab/templates/pos/register_external_card.html:40 amelie/personal_tab/templates/pos/scan_external_card.html:27 amelie/room_duty/templates/room_duty/balcony_duty/delete.html:17 amelie/room_duty/templates/room_duty/pool/delete.html:38 amelie/room_duty/templates/room_duty/pool/form.html:17 amelie/room_duty/templates/room_duty/table/delete.html:18 amelie/room_duty/templates/room_duty/table/form.html:56 amelie/room_duty/templates/room_duty/table/room_duty_delete.html:26 amelie/room_duty/templates/room_duty/template/add.html:17 amelie/room_duty/templates/room_duty/template/delete.html:18 templates/oauth2_provider/authorize.html:35 msgid "Cancel" msgstr "Annuleer" -#: amelie/activities/templates/activities/activity_form.html:116 -#: amelie/activities/templates/activity_list.html:36 -#: amelie/personal_tab/models.py:181 +#: amelie/activities/templates/activities/activity_form.html:116 amelie/activities/templates/activity_list.html:36 amelie/personal_tab/models.py:181 msgid "Enrollment" msgstr "Inschrijving" @@ -919,48 +639,13 @@ msgstr "Inschrijfopties verwijderen" #, python-format msgid "" "\n" -" Are you sure you want to remove enrollment option " -"%(object)s for %(activity)s?\n" +" Are you sure you want to remove enrollment option %(object)s for %(activity)s?\n" " " msgstr "" "\n" -"Weet je zeker dat je inschrijfoptie %(object)s voor %(activity)s wilt " -"verwijderen?" - -#: amelie/activities/templates/activities/enrollmentoption_confirm_delete.html:19 -#: amelie/activities/templates/activities/enrollmentoption_list.html:47 -#: amelie/activities/templates/activities/enrollmentoption_list.html:58 -#: amelie/activities/templates/activities/enrollmentoption_list.html:94 -#: amelie/activities/templates/activities/enrollmentoption_list.html:106 -#: amelie/activities/templates/activities/enrollmentoption_list.html:139 -#: amelie/activities/templates/activities/enrollmentoption_list.html:148 -#: amelie/activities/templates/activities/enrollmentoption_list.html:181 -#: amelie/activities/templates/activities/enrollmentoption_list.html:190 -#: amelie/activities/templates/activity.html:38 -#: amelie/claudia/templates/claudia/extrapersonalalias_delete.html:19 -#: amelie/companies/templates/companies/company_event.html:20 -#: amelie/education/templates/education_event.html:19 -#: amelie/members/templates/members/payment_confirm_delete.html:19 -#: amelie/members/templates/person_edit_employee.html:13 -#: amelie/personal_tab/templates/cookie_corner/transaction_delete.html:21 -#: amelie/personal_tab/templates/info/rfid_cards.html:63 -#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:26 -#: amelie/room_duty/templates/room_duty/balcony_duty/delete.html:22 -#: amelie/room_duty/templates/room_duty/pool/delete.html:42 -#: amelie/room_duty/templates/room_duty/pool/list.html:24 -#: amelie/room_duty/templates/room_duty/pool/persons_change.html:20 -#: amelie/room_duty/templates/room_duty/table/change.html:41 -#: amelie/room_duty/templates/room_duty/table/change_persons.html:20 -#: amelie/room_duty/templates/room_duty/table/delete.html:22 -#: amelie/room_duty/templates/room_duty/table/list.html:24 -#: amelie/room_duty/templates/room_duty/table/overview.html:89 -#: amelie/room_duty/templates/room_duty/table/room_duty_delete.html:30 -#: amelie/room_duty/templates/room_duty/template/change.html:41 -#: amelie/room_duty/templates/room_duty/template/delete.html:22 -#: amelie/room_duty/templates/room_duty/template/list.html:23 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:83 -#: templates/oauth2_provider/authorized-token-delete.html:13 -#: templates/oauth2_provider/includes/user_oauth_table.html:9 +"Weet je zeker dat je inschrijfoptie %(object)s voor %(activity)s wilt verwijderen?" + +#: amelie/activities/templates/activities/enrollmentoption_confirm_delete.html:19 amelie/activities/templates/activities/enrollmentoption_list.html:47 amelie/activities/templates/activities/enrollmentoption_list.html:58 amelie/activities/templates/activities/enrollmentoption_list.html:94 amelie/activities/templates/activities/enrollmentoption_list.html:106 amelie/activities/templates/activities/enrollmentoption_list.html:139 amelie/activities/templates/activities/enrollmentoption_list.html:148 amelie/activities/templates/activities/enrollmentoption_list.html:181 amelie/activities/templates/activities/enrollmentoption_list.html:190 amelie/activities/templates/activity.html:38 amelie/claudia/templates/claudia/extrapersonalalias_delete.html:19 amelie/companies/templates/companies/company_event.html:20 amelie/education/templates/education_event.html:19 amelie/members/templates/members/payment_confirm_delete.html:19 amelie/members/templates/person_edit_employee.html:13 amelie/personal_tab/templates/cookie_corner/transaction_delete.html:21 amelie/personal_tab/templates/info/rfid_cards.html:63 amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:26 amelie/room_duty/templates/room_duty/balcony_duty/delete.html:22 amelie/room_duty/templates/room_duty/pool/delete.html:42 amelie/room_duty/templates/room_duty/pool/list.html:24 amelie/room_duty/templates/room_duty/pool/persons_change.html:20 amelie/room_duty/templates/room_duty/table/change.html:41 amelie/room_duty/templates/room_duty/table/change_persons.html:20 amelie/room_duty/templates/room_duty/table/delete.html:22 amelie/room_duty/templates/room_duty/table/list.html:24 amelie/room_duty/templates/room_duty/table/overview.html:89 amelie/room_duty/templates/room_duty/table/room_duty_delete.html:30 amelie/room_duty/templates/room_duty/template/change.html:41 amelie/room_duty/templates/room_duty/template/delete.html:22 amelie/room_duty/templates/room_duty/template/list.html:23 amelie/weekmail/templates/weekmail/weekmail_wizard.html:83 templates/oauth2_provider/authorized-token-delete.html:13 templates/oauth2_provider/includes/user_oauth_table.html:9 msgid "Delete" msgstr "Verwijder" @@ -987,8 +672,7 @@ msgstr "Inschrijfopties voor %(activity)s wijzigen" #, python-format msgid "" "\n" -" Edit the enrollment options for " -"%(activity)s here.\n" +" Edit the enrollment options for %(activity)s here.\n" " " msgstr "" "\n" @@ -997,88 +681,46 @@ msgstr "" #: amelie/activities/templates/activities/enrollmentoption_list.html:20 msgid "" "\n" -" Enrollment options cannot be added or edited because " -"this activity already has enrollments.\n" +" Enrollment options cannot be added or edited because this activity already has enrollments.\n" " " msgstr "" "\n" -"Inschrijfopties kunnen niet toegevoegd of verwijderd worden omdat deze " -"activiteit al inschrijvingen heeft." +"Inschrijfopties kunnen niet toegevoegd of verwijderd worden omdat deze activiteit al inschrijvingen heeft." #: amelie/activities/templates/activities/enrollmentoption_list.html:25 msgid "" "\n" -" Edits to prices of enrollment options only have " -"effect on new enrollments.\n" +" Edits to prices of enrollment options only have effect on new enrollments.\n" " " msgstr "" "\n" -"Wijzigingen aan prijzen van inschrijfopties hebben alleen effect voor nieuwe " -"inschrijvingen." +"Wijzigingen aan prijzen van inschrijfopties hebben alleen effect voor nieuwe inschrijvingen." #: amelie/activities/templates/activities/enrollmentoption_list.html:34 msgid "Checkboxes" msgstr "Checkboxen" -#: amelie/activities/templates/activities/enrollmentoption_list.html:42 -#: amelie/activities/templates/activities/enrollmentoption_list.html:88 +#: amelie/activities/templates/activities/enrollmentoption_list.html:42 amelie/activities/templates/activities/enrollmentoption_list.html:88 msgid "Extra price" msgstr "Extra prijs" -#: amelie/activities/templates/activities/enrollmentoption_list.html:43 -#: amelie/activities/templates/activities/enrollmentoption_list.html:89 +#: amelie/activities/templates/activities/enrollmentoption_list.html:43 amelie/activities/templates/activities/enrollmentoption_list.html:89 msgid "Limit" msgstr "Limiet" -#: amelie/activities/templates/activities/enrollmentoption_list.html:44 -#: amelie/activities/templates/activities/enrollmentoption_list.html:90 +#: amelie/activities/templates/activities/enrollmentoption_list.html:44 amelie/activities/templates/activities/enrollmentoption_list.html:90 msgid "Spots left" msgstr "Plekken over" -#: amelie/activities/templates/activities/enrollmentoption_list.html:45 -#: amelie/activities/templates/activities/enrollmentoption_list.html:56 -#: amelie/activities/templates/activities/enrollmentoption_list.html:92 -#: amelie/activities/templates/activities/enrollmentoption_list.html:104 -#: amelie/activities/templates/activities/enrollmentoption_list.html:137 -#: amelie/activities/templates/activities/enrollmentoption_list.html:146 -#: amelie/activities/templates/activities/enrollmentoption_list.html:179 -#: amelie/activities/templates/activities/enrollmentoption_list.html:188 -#: amelie/activities/templates/activity.html:35 -#: amelie/companies/templates/companies/company_event.html:19 -#: amelie/companies/templates/companies/includes/company_grid_item.html:20 -#: amelie/education/templates/complaint.html:21 -#: amelie/education/templates/education_event.html:18 -#: amelie/members/templates/includes/committee_data.html:50 -#: amelie/members/templates/includes/person_data_table.html:189 -#: amelie/members/templates/person_employee.html:14 -#: amelie/members/templates/person_functions.html:10 -#: amelie/members/templates/person_functions.html:18 -#: amelie/members/templates/person_preferences.html:18 -#: amelie/members/templates/person_study.html:38 -#: amelie/personal_tab/templates/cookie_corner/transaction_form.html:32 -#: amelie/personal_tab/templates/info/account_information.html:62 -#: amelie/room_duty/templates/room_duty/table/list.html:21 -#: amelie/room_duty/templates/room_duty/table/overview.html:87 -#: amelie/room_duty/templates/room_duty/template/list.html:20 -#: amelie/weekmail/templates/weekmail/weekmail_list.html:20 -#: amelie/weekmail/templates/weekmail/weekmail_list.html:29 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:85 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:142 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:226 -#: templates/profile_overview.html:17 +#: amelie/activities/templates/activities/enrollmentoption_list.html:45 amelie/activities/templates/activities/enrollmentoption_list.html:56 amelie/activities/templates/activities/enrollmentoption_list.html:92 amelie/activities/templates/activities/enrollmentoption_list.html:104 amelie/activities/templates/activities/enrollmentoption_list.html:137 amelie/activities/templates/activities/enrollmentoption_list.html:146 amelie/activities/templates/activities/enrollmentoption_list.html:179 amelie/activities/templates/activities/enrollmentoption_list.html:188 amelie/activities/templates/activity.html:35 amelie/companies/templates/companies/company_event.html:19 amelie/companies/templates/companies/includes/company_grid_item.html:20 amelie/education/templates/complaint.html:21 amelie/education/templates/education_event.html:18 amelie/members/templates/includes/committee_data.html:50 amelie/members/templates/includes/person_data_table.html:189 amelie/members/templates/person_employee.html:14 amelie/members/templates/person_functions.html:10 amelie/members/templates/person_functions.html:18 amelie/members/templates/person_preferences.html:18 amelie/members/templates/person_study.html:38 amelie/personal_tab/templates/cookie_corner/transaction_form.html:32 amelie/personal_tab/templates/info/account_information.html:62 amelie/room_duty/templates/room_duty/table/list.html:21 amelie/room_duty/templates/room_duty/table/overview.html:87 amelie/room_duty/templates/room_duty/template/list.html:20 amelie/weekmail/templates/weekmail/weekmail_list.html:20 amelie/weekmail/templates/weekmail/weekmail_list.html:29 amelie/weekmail/templates/weekmail/weekmail_wizard.html:85 amelie/weekmail/templates/weekmail/weekmail_wizard.html:142 amelie/weekmail/templates/weekmail/weekmail_wizard.html:226 templates/profile_overview.html:17 msgid "Edit" msgstr "Wijzig" -#: amelie/activities/templates/activities/enrollmentoption_list.html:54 -#: amelie/activities/templates/activities/enrollmentoption_list.html:101 -#: amelie/personal_tab/templates/pos/home.html:76 +#: amelie/activities/templates/activities/enrollmentoption_list.html:54 amelie/activities/templates/activities/enrollmentoption_list.html:101 amelie/personal_tab/templates/pos/home.html:76 msgid "Unlimited" msgstr "Ongelimiteerd" -#: amelie/activities/templates/activities/enrollmentoption_list.html:67 -#: amelie/activities/templates/activities/enrollmentoption_list.html:115 -#: amelie/activities/templates/activities/enrollmentoption_list.html:157 -#: amelie/activities/templates/activities/enrollmentoption_list.html:199 +#: amelie/activities/templates/activities/enrollmentoption_list.html:67 amelie/activities/templates/activities/enrollmentoption_list.html:115 amelie/activities/templates/activities/enrollmentoption_list.html:157 amelie/activities/templates/activities/enrollmentoption_list.html:199 msgid "None" msgstr "Geen" @@ -1114,79 +756,35 @@ msgstr "Eten" msgid "Add food" msgstr "Eten toevoegen" -#: amelie/activities/templates/activities/eventdesk/detail.html:5 -#: amelie/activities/templates/activities/eventdesk/match.html:5 +#: amelie/activities/templates/activities/eventdesk/detail.html:5 amelie/activities/templates/activities/eventdesk/match.html:5 msgid "Event Desk message detail" msgstr "Evenementenbureau Berichtdetails" -#: amelie/activities/templates/activities/eventdesk/detail.html:12 -#: amelie/activities/templates/activities/eventdesk/match.html:12 +#: amelie/activities/templates/activities/eventdesk/detail.html:12 amelie/activities/templates/activities/eventdesk/match.html:12 msgid "Metadata" msgstr "Metadata" -#: amelie/activities/templates/activities/eventdesk/detail.html:17 -#: amelie/activities/templates/activities/eventdesk/match.html:17 -#: amelie/activities/templates/activity_list.html:33 -#: amelie/activities/templates/activity_list.html:105 -#: amelie/activities/templates/activity_old.html:33 -#: amelie/companies/templates/companies/company_event_list.html:16 -#: amelie/companies/templates/companies/company_event_list.html:73 -#: amelie/companies/templates/companies/company_event_old.html:33 -#: amelie/companies/templates/companies/company_statistics.html:137 -#: amelie/education/templates/education_event_overview.html:15 -#: amelie/education/templates/education_event_overview.html:65 -#: amelie/members/models.py:855 amelie/personal_tab/forms.py:16 -#: amelie/personal_tab/forms.py:24 amelie/personal_tab/forms.py:75 -#: amelie/personal_tab/models.py:121 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:66 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:109 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:141 -#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:15 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:188 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:242 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:323 -#: amelie/personal_tab/templates/info/debt_collection_instructions.html:17 -#: amelie/personal_tab/templates/info/transaction_information.html:3 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:8 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:8 -#: amelie/personal_tab/templates/lists/custom_transactions.html:8 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:8 -#: amelie/personal_tab/templates/lists/transactions.html:8 -#: amelie/personal_tab/templates/wrapped.html:168 +#: amelie/activities/templates/activities/eventdesk/detail.html:17 amelie/activities/templates/activities/eventdesk/match.html:17 amelie/activities/templates/activity_list.html:33 amelie/activities/templates/activity_list.html:105 amelie/activities/templates/activity_old.html:33 amelie/companies/templates/companies/company_event_list.html:16 amelie/companies/templates/companies/company_event_list.html:73 amelie/companies/templates/companies/company_event_old.html:33 amelie/companies/templates/companies/company_statistics.html:137 amelie/education/templates/education_event_overview.html:15 amelie/education/templates/education_event_overview.html:65 amelie/members/models.py:855 amelie/personal_tab/forms.py:16 amelie/personal_tab/forms.py:24 amelie/personal_tab/forms.py:75 amelie/personal_tab/models.py:121 amelie/personal_tab/templates/cookie_corner_authorization_view.html:66 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:109 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:141 amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:15 amelie/personal_tab/templates/cookie_corner_statistics.html:188 amelie/personal_tab/templates/cookie_corner_statistics.html:242 amelie/personal_tab/templates/cookie_corner_statistics.html:323 amelie/personal_tab/templates/info/debt_collection_instructions.html:17 amelie/personal_tab/templates/info/transaction_information.html:3 amelie/personal_tab/templates/lists/alexia_transactions.html:8 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:8 amelie/personal_tab/templates/lists/custom_transactions.html:8 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:8 amelie/personal_tab/templates/lists/transactions.html:8 amelie/personal_tab/templates/wrapped.html:168 msgid "Date" msgstr "Datum" -#: amelie/activities/templates/activities/eventdesk/detail.html:21 -#: amelie/activities/templates/activities/eventdesk/history.html:60 -#: amelie/activities/templates/activities/eventdesk/match.html:21 -#: amelie/activities/templates/activities/eventdesk/message_list.html:150 -#: amelie/activities/templates/activities/eventdesk/message_list.html:191 +#: amelie/activities/templates/activities/eventdesk/detail.html:21 amelie/activities/templates/activities/eventdesk/history.html:60 amelie/activities/templates/activities/eventdesk/match.html:21 amelie/activities/templates/activities/eventdesk/message_list.html:150 amelie/activities/templates/activities/eventdesk/message_list.html:191 msgid "Requester" msgstr "Aanvrager" -#: amelie/activities/templates/activities/eventdesk/detail.html:25 -#: amelie/activities/templates/activities/eventdesk/history.html:61 -#: amelie/activities/templates/activities/eventdesk/match.html:25 -#: amelie/activities/templates/activities/eventdesk/message_list.html:151 -#: amelie/activities/templates/activities/eventdesk/message_list.html:192 +#: amelie/activities/templates/activities/eventdesk/detail.html:25 amelie/activities/templates/activities/eventdesk/history.html:61 amelie/activities/templates/activities/eventdesk/match.html:25 amelie/activities/templates/activities/eventdesk/message_list.html:151 amelie/activities/templates/activities/eventdesk/message_list.html:192 msgid "Event name" msgstr "Naam evenement" -#: amelie/activities/templates/activities/eventdesk/detail.html:29 -#: amelie/activities/templates/activities/eventdesk/history.html:62 -#: amelie/activities/templates/activities/eventdesk/match.html:29 +#: amelie/activities/templates/activities/eventdesk/detail.html:29 amelie/activities/templates/activities/eventdesk/history.html:62 amelie/activities/templates/activities/eventdesk/match.html:29 msgid "Event start" msgstr "Begintijd evenement" -#: amelie/activities/templates/activities/eventdesk/detail.html:33 -#: amelie/activities/templates/activities/eventdesk/history.html:63 -#: amelie/activities/templates/activities/eventdesk/match.html:33 +#: amelie/activities/templates/activities/eventdesk/detail.html:33 amelie/activities/templates/activities/eventdesk/history.html:63 amelie/activities/templates/activities/eventdesk/match.html:33 msgid "Event end" msgstr "Eindtijd evenement" -#: amelie/activities/templates/activities/eventdesk/detail.html:37 -#: amelie/activities/templates/activities/eventdesk/history.html:64 -#: amelie/activities/templates/activities/eventdesk/match.html:37 +#: amelie/activities/templates/activities/eventdesk/detail.html:37 amelie/activities/templates/activities/eventdesk/history.html:64 amelie/activities/templates/activities/eventdesk/match.html:37 msgid "Event location" msgstr "Locatie evenement" @@ -1194,23 +792,19 @@ msgstr "Locatie evenement" msgid "Activity link" msgstr "Activiteitenkoppeling" -#: amelie/activities/templates/activities/eventdesk/detail.html:51 -#: amelie/activities/templates/activities/eventdesk/match.html:51 +#: amelie/activities/templates/activities/eventdesk/detail.html:51 amelie/activities/templates/activities/eventdesk/match.html:51 msgid "Matching certainty" msgstr "Zekerheidspercentage" -#: amelie/activities/templates/activities/eventdesk/detail.html:57 -#: amelie/activities/templates/activities/eventdesk/match.html:55 +#: amelie/activities/templates/activities/eventdesk/detail.html:57 amelie/activities/templates/activities/eventdesk/match.html:55 msgid "New state (as of this e-mail)" msgstr "Nieuwe status (vanaf deze e-mail)" -#: amelie/activities/templates/activities/eventdesk/detail.html:64 -#: amelie/activities/templates/activities/eventdesk/match.html:62 +#: amelie/activities/templates/activities/eventdesk/detail.html:64 amelie/activities/templates/activities/eventdesk/match.html:62 msgid "Go back to message list" msgstr "Terug naar berichtenlijst" -#: amelie/activities/templates/activities/eventdesk/detail.html:66 -#: amelie/activities/templates/activities/eventdesk/match.html:64 +#: amelie/activities/templates/activities/eventdesk/detail.html:66 amelie/activities/templates/activities/eventdesk/match.html:64 msgid "All messages for the linked event" msgstr "Alle berichten voor het gekoppelde evenement" @@ -1226,14 +820,11 @@ msgstr "Activiteitenkoppeling verwijderen" msgid "Link to activity" msgstr "Koppel aan activiteit" -#: amelie/activities/templates/activities/eventdesk/detail.html:82 -#: amelie/members/templates/includes/query/query_push.html:74 -#: amelie/members/templates/message.html:4 +#: amelie/activities/templates/activities/eventdesk/detail.html:82 amelie/members/templates/includes/query/query_push.html:74 amelie/members/templates/message.html:4 msgid "Message" msgstr "Bericht" -#: amelie/activities/templates/activities/eventdesk/detail.html:87 -#: amelie/companies/forms.py:17 +#: amelie/activities/templates/activities/eventdesk/detail.html:87 amelie/companies/forms.py:17 msgid "From" msgstr "Van" @@ -1241,9 +832,7 @@ msgstr "Van" msgid "To" msgstr "Naar" -#: amelie/activities/templates/activities/eventdesk/detail.html:93 -#: amelie/education/forms.py:53 amelie/education/forms.py:54 -#: amelie/education/models.py:251 amelie/education/models.py:263 +#: amelie/activities/templates/activities/eventdesk/detail.html:93 amelie/education/forms.py:53 amelie/education/forms.py:54 amelie/education/models.py:251 amelie/education/models.py:263 msgid "Subject" msgstr "Onderwerp" @@ -1261,68 +850,35 @@ msgstr "" msgid "Activity information" msgstr "Activiteitsinformatie" -#: amelie/activities/templates/activities/eventdesk/history.html:18 -#: amelie/activities/templates/activity.html:55 -#: amelie/companies/templates/companies/company_event.html:34 -#: amelie/education/templates/education_event.html:33 +#: amelie/activities/templates/activities/eventdesk/history.html:18 amelie/activities/templates/activity.html:55 amelie/companies/templates/companies/company_event.html:34 amelie/education/templates/education_event.html:33 msgid "Who" msgstr "Wie" -#: amelie/activities/templates/activities/eventdesk/history.html:21 -#: amelie/activities/templates/activity.html:58 -#: amelie/companies/templates/companies/company_event.html:43 -#: amelie/education/templates/education_event.html:38 +#: amelie/activities/templates/activities/eventdesk/history.html:21 amelie/activities/templates/activity.html:58 amelie/companies/templates/companies/company_event.html:43 amelie/education/templates/education_event.html:38 msgid "What" msgstr "Wat" -#: amelie/activities/templates/activities/eventdesk/history.html:24 -#: amelie/activities/templates/activity.html:61 -#: amelie/companies/templates/companies/company_event.html:46 -#: amelie/education/templates/education_event.html:41 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:178 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:206 +#: amelie/activities/templates/activities/eventdesk/history.html:24 amelie/activities/templates/activity.html:61 amelie/companies/templates/companies/company_event.html:46 amelie/education/templates/education_event.html:41 amelie/weekmail/templates/weekmail/weekmail_wizard.html:178 amelie/weekmail/templates/weekmail/weekmail_wizard.html:206 msgid "Where" msgstr "Waar" -#: amelie/activities/templates/activities/eventdesk/history.html:27 -#: amelie/activities/templates/activity.html:64 -#: amelie/companies/templates/companies/company_event.html:49 -#: amelie/education/templates/education_event.html:44 +#: amelie/activities/templates/activities/eventdesk/history.html:27 amelie/activities/templates/activity.html:64 amelie/companies/templates/companies/company_event.html:49 amelie/education/templates/education_event.html:44 msgid "When" msgstr "Wanneer" -#: amelie/activities/templates/activities/eventdesk/history.html:31 -#: amelie/activities/templates/activities/eventdesk/history.html:34 -#: amelie/activities/templates/activity.html:68 -#: amelie/activities/templates/activity.html:71 amelie/companies/models.py:61 -#: amelie/companies/templates/companies/company_event.html:53 -#: amelie/companies/templates/companies/company_event.html:56 -#: amelie/education/templates/education_event.html:48 -#: amelie/education/templates/education_event.html:51 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:12 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:12 +#: amelie/activities/templates/activities/eventdesk/history.html:31 amelie/activities/templates/activities/eventdesk/history.html:34 amelie/activities/templates/activity.html:68 amelie/activities/templates/activity.html:71 amelie/companies/models.py:61 amelie/companies/templates/companies/company_event.html:53 amelie/companies/templates/companies/company_event.html:56 amelie/education/templates/education_event.html:48 amelie/education/templates/education_event.html:51 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:12 amelie/personal_tab/templates/cookie_corner_transactions_new.html:12 msgid "from" msgstr "van" -#: amelie/activities/templates/activities/eventdesk/history.html:32 -#: amelie/activities/templates/activities/eventdesk/history.html:35 -#: amelie/activities/templates/activity.html:69 -#: amelie/activities/templates/activity.html:72 amelie/companies/models.py:64 -#: amelie/companies/templates/companies/company_event.html:54 -#: amelie/companies/templates/companies/company_event.html:57 -#: amelie/education/templates/education_event.html:49 -#: amelie/education/templates/education_event.html:52 +#: amelie/activities/templates/activities/eventdesk/history.html:32 amelie/activities/templates/activities/eventdesk/history.html:35 amelie/activities/templates/activity.html:69 amelie/activities/templates/activity.html:72 amelie/companies/models.py:64 amelie/companies/templates/companies/company_event.html:54 amelie/companies/templates/companies/company_event.html:57 amelie/education/templates/education_event.html:49 amelie/education/templates/education_event.html:52 msgid "until" msgstr "tot" -#: amelie/activities/templates/activities/eventdesk/history.html:40 -#: amelie/activities/templates/activity.html:111 -#: amelie/companies/templates/companies/company_event.html:64 +#: amelie/activities/templates/activities/eventdesk/history.html:40 amelie/activities/templates/activity.html:111 amelie/companies/templates/companies/company_event.html:64 msgid "Dutch will be spoken at this activity." msgstr "Bij deze activiteit wordt Nederlands gesproken" -#: amelie/activities/templates/activities/eventdesk/history.html:48 -#: amelie/activities/templates/activities/eventdesk/message_list.html:5 +#: amelie/activities/templates/activities/eventdesk/history.html:48 amelie/activities/templates/activities/eventdesk/message_list.html:5 msgid "Event Desk messages" msgstr "Berichten van Evenementenbureau" @@ -1331,32 +887,18 @@ msgid "All messages" msgstr "Alle berichten" #: amelie/activities/templates/activities/eventdesk/history.html:54 -msgid "" -"These are the UT event desk messages that we received for this activity." -msgstr "" -"Dit zijn de berichten die we hebben gekregen van het UT evenementenbureau " -"over deze activiteit." +msgid "These are the UT event desk messages that we received for this activity." +msgstr "Dit zijn de berichten die we hebben gekregen van het UT evenementenbureau over deze activiteit." -#: amelie/activities/templates/activities/eventdesk/history.html:59 -#: amelie/activities/templates/activities/eventdesk/message_list.html:149 -#: amelie/activities/templates/activities/eventdesk/message_list.html:190 +#: amelie/activities/templates/activities/eventdesk/history.html:59 amelie/activities/templates/activities/eventdesk/message_list.html:149 amelie/activities/templates/activities/eventdesk/message_list.html:190 msgid "Date of message" msgstr "Datum van bericht" -#: amelie/activities/templates/activities/eventdesk/history.html:65 -#: amelie/activities/templates/activities/eventdesk/message_list.html:154 -#: amelie/activities/templates/activities/eventdesk/message_list.html:195 +#: amelie/activities/templates/activities/eventdesk/history.html:65 amelie/activities/templates/activities/eventdesk/message_list.html:154 amelie/activities/templates/activities/eventdesk/message_list.html:195 msgid "State" msgstr "Status" -#: amelie/activities/templates/activities/eventdesk/history.html:66 -#: amelie/activities/templates/activities/eventdesk/history.html:81 -#: amelie/activities/templates/activities/eventdesk/message_list.html:72 -#: amelie/activities/templates/activities/eventdesk/message_list.html:104 -#: amelie/activities/templates/activities/eventdesk/message_list.html:156 -#: amelie/activities/templates/activities/eventdesk/message_list.html:169 -#: amelie/activities/templates/activities/eventdesk/message_list.html:197 -#: amelie/activities/templates/activities/eventdesk/message_list.html:218 +#: amelie/activities/templates/activities/eventdesk/history.html:66 amelie/activities/templates/activities/eventdesk/history.html:81 amelie/activities/templates/activities/eventdesk/message_list.html:72 amelie/activities/templates/activities/eventdesk/message_list.html:104 amelie/activities/templates/activities/eventdesk/message_list.html:156 amelie/activities/templates/activities/eventdesk/message_list.html:169 amelie/activities/templates/activities/eventdesk/message_list.html:197 amelie/activities/templates/activities/eventdesk/message_list.html:218 msgid "Details" msgstr "Details" @@ -1373,82 +915,45 @@ msgid "Match with activity" msgstr "Koppel met activiteit" #: amelie/activities/templates/activities/eventdesk/match.html:76 -msgid "" -"Please choose the activity that you want to match this message to and save." -msgstr "" -"Kies a.u.b. de activiteit die je aan dit bericht wilt koppelen en sla op." +msgid "Please choose the activity that you want to match this message to and save." +msgstr "Kies a.u.b. de activiteit die je aan dit bericht wilt koppelen en sla op." #: amelie/activities/templates/activities/eventdesk/match.html:77 -msgid "" -"Only activities from a week before until a week after the reservation are " -"shown." -msgstr "" -"Alleen activiteiten van een week voor tot een week na de reservering worden " -"getoond." +msgid "Only activities from a week before until a week after the reservation are shown." +msgstr "Alleen activiteiten van een week voor tot een week na de reservering worden getoond." #: amelie/activities/templates/activities/eventdesk/message_list.html:10 msgid "Event desk messages" msgstr "Berichten van het Evenementenbureau" #: amelie/activities/templates/activities/eventdesk/message_list.html:13 -msgid "" -"This page shows the event registration status of activities of Inter-" -"Actief." -msgstr "" -"Deze pagina toont de aanmeldingsstatus van activiteiten van Inter-Actief" +msgid "This page shows the event registration status of activities of Inter-Actief." +msgstr "Deze pagina toont de aanmeldingsstatus van activiteiten van Inter-Actief" #: amelie/activities/templates/activities/eventdesk/message_list.html:16 -msgid "" -"Each activity that takes place on university terrain, outside of the opening " -"hours of the building or the terrain, should be registered at the " -"University's Event Desk." -msgstr "" -"Elke activiteit die plaatsvindt op universiteitsterrein, buiten de normale " -"openingstijden van het gebouw of het terrein, moet aangemeld worden bij het " -"Evenementenbureau van de Universiteit." +msgid "Each activity that takes place on university terrain, outside of the opening hours of the building or the terrain, should be registered at the University's Event Desk." +msgstr "Elke activiteit die plaatsvindt op universiteitsterrein, buiten de normale openingstijden van het gebouw of het terrein, moet aangemeld worden bij het Evenementenbureau van de Universiteit." #: amelie/activities/templates/activities/eventdesk/message_list.html:19 -msgid "" -"To register an activity, go to the " -"event desk." -msgstr "" -"Om een activiteit aan te melden, ga naar het evenementenbureau." +msgid "To register an activity, go to the event desk." +msgstr "Om een activiteit aan te melden, ga naar het evenementenbureau." #: amelie/activities/templates/activities/eventdesk/message_list.html:22 #, python-format -msgid "" -"IMPORTANT: Enter %(ia_event_email)s as the alternative e-mail address in the UT form to make this page " -"work properly" -msgstr "" -"BELANGRIJK: Gebruik " -"%(ia_event_email)s als het afwijkend e-mail adres in het UT-formulier " -"om deze pagina goed te laten werken" +msgid "IMPORTANT: Enter %(ia_event_email)s as the alternative e-mail address in the UT form to make this page work properly" +msgstr "BELANGRIJK: Gebruik %(ia_event_email)s als het afwijkend e-mail adres in het UT-formulier om deze pagina goed te laten werken" #: amelie/activities/templates/activities/eventdesk/message_list.html:25 -msgid "" -"The mailbox is checked each hour, at 30 minutes past the hour. If your " -"registration does not show up after that time, contact the Officer of " -"Internal Affairs." -msgstr "" -"De mailbox wordt elk uur gecheckt, om 30 minuten over het uur. Als je " -"aanmelding daarna nog niet op deze pagina staat, neem dan contact op met de " -"Functionaris Interne Betrekkingen." +msgid "The mailbox is checked each hour, at 30 minutes past the hour. If your registration does not show up after that time, contact the Officer of Internal Affairs." +msgstr "De mailbox wordt elk uur gecheckt, om 30 minuten over het uur. Als je aanmelding daarna nog niet op deze pagina staat, neem dan contact op met de Functionaris Interne Betrekkingen." #: amelie/activities/templates/activities/eventdesk/message_list.html:31 msgid "Activity status" msgstr "Activiteitstatus" #: amelie/activities/templates/activities/eventdesk/message_list.html:35 -msgid "" -"These are all upcoming activities, and activities that happened in the past " -"week, and their status at the UT event desk." -msgstr "" -"Dit zijn alle toekomstige activiteiten, en activiteiten die in de afgelopen " -"week hebben plaatsgevonden, en hun status bij het reserveringsbureau van de " -"UT." +msgid "These are all upcoming activities, and activities that happened in the past week, and their status at the UT event desk." +msgstr "Dit zijn alle toekomstige activiteiten, en activiteiten die in de afgelopen week hebben plaatsgevonden, en hun status bij het reserveringsbureau van de UT." #: amelie/activities/templates/activities/eventdesk/message_list.html:38 msgid "Only activities that you are allowed to edit are shown." @@ -1458,10 +963,7 @@ msgstr "Alleen activiteiten die jij mag aanpassen worden getoond." msgid "Legend" msgstr "Legenda" -#: amelie/activities/templates/activities/eventdesk/message_list.html:47 -#: amelie/activities/templates/activities/eventdesk/message_list.html:86 -#: amelie/activities/templates/activities/eventdesk/message_list.html:118 -#: amelie/activities/templates/activity.html:98 +#: amelie/activities/templates/activities/eventdesk/message_list.html:47 amelie/activities/templates/activities/eventdesk/message_list.html:86 amelie/activities/templates/activities/eventdesk/message_list.html:118 amelie/activities/templates/activity.html:98 msgid "Unregistered" msgstr "Niet aangemeld" @@ -1486,35 +988,23 @@ msgstr "Elke status (oranje rand)" msgid "(Match between UT and IA activity <60%% certain)" msgstr "(Koppeling tussen UT en IA <60%% zeker)" -#: amelie/activities/templates/activities/eventdesk/message_list.html:66 -#: templates/frontpage.html:14 +#: amelie/activities/templates/activities/eventdesk/message_list.html:66 templates/frontpage.html:14 msgid "Upcoming activities" msgstr "Komende activiteiten" -#: amelie/activities/templates/activities/eventdesk/message_list.html:69 -#: amelie/activities/templates/activities/eventdesk/message_list.html:101 +#: amelie/activities/templates/activities/eventdesk/message_list.html:69 amelie/activities/templates/activities/eventdesk/message_list.html:101 msgid "Start date/time" msgstr "Begindatum/tijd" -#: amelie/activities/templates/activities/eventdesk/message_list.html:71 -#: amelie/activities/templates/activities/eventdesk/message_list.html:103 -#: amelie/data_export/templates/data_export/dataexport_detail.html:89 -#: amelie/members/templates/registration_check.html:100 -#: amelie/personal_tab/forms.py:125 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:80 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:36 -#: amelie/personal_tab/templates/info/rfid_cards.html:14 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:36 +#: amelie/activities/templates/activities/eventdesk/message_list.html:71 amelie/activities/templates/activities/eventdesk/message_list.html:103 amelie/data_export/templates/data_export/dataexport_detail.html:89 amelie/members/templates/registration_check.html:100 amelie/personal_tab/forms.py:125 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:80 amelie/personal_tab/templates/cookie_corner_process_batch.html:36 amelie/personal_tab/templates/info/rfid_cards.html:14 amelie/weekmail/templates/weekmail/weekmail_wizard.html:36 msgid "Status" msgstr "Status" -#: amelie/activities/templates/activities/eventdesk/message_list.html:84 -#: amelie/activities/templates/activities/eventdesk/message_list.html:116 +#: amelie/activities/templates/activities/eventdesk/message_list.html:84 amelie/activities/templates/activities/eventdesk/message_list.html:116 msgid "History" msgstr "Geschiedenis" -#: amelie/activities/templates/activities/eventdesk/message_list.html:92 -#: amelie/activities/templates/activities/eventdesk/message_list.html:124 +#: amelie/activities/templates/activities/eventdesk/message_list.html:92 amelie/activities/templates/activities/eventdesk/message_list.html:124 msgid "There are no activities visible to you in this timeframe." msgstr "Er zijn geen activiteiten zichtbaar in deze tijdsperiode." @@ -1527,44 +1017,26 @@ msgid "Unlinked messages" msgstr "Niet-gekoppelde berichten" #: amelie/activities/templates/activities/eventdesk/message_list.html:138 -msgid "" -"These are the last 15 event registration messages that we received and that " -"are not matched to any activity." -msgstr "" -"Dit zijn de laatste 15 aanmeldingsberichten die we hebben ontvangen en die " -"nog niet gekoppeld zijn aan een activiteit." +msgid "These are the last 15 event registration messages that we received and that are not matched to any activity." +msgstr "Dit zijn de laatste 15 aanmeldingsberichten die we hebben ontvangen en die nog niet gekoppeld zijn aan een activiteit." #: amelie/activities/templates/activities/eventdesk/message_list.html:141 -msgid "" -"This might mean that the event is not on the website yet (possibly because " -"it is a graduation drink or other non-IA-activity), or that it could not be " -"matched." -msgstr "" -"Dit kan betekenen dat het evenement nog niet op de website is aangemaakt " -"(mogelijk omdat het een afstudeerborrel of andere niet-IA-activiteit is), of " -"het kan zijn dat het koppelen mislukt is." +msgid "This might mean that the event is not on the website yet (possibly because it is a graduation drink or other non-IA-activity), or that it could not be matched." +msgstr "Dit kan betekenen dat het evenement nog niet op de website is aangemaakt (mogelijk omdat het een afstudeerborrel of andere niet-IA-activiteit is), of het kan zijn dat het koppelen mislukt is." #: amelie/activities/templates/activities/eventdesk/message_list.html:144 -msgid "" -"You can manually match these messages to an activity by clicking the \"Match" -"\" button, if necessary." -msgstr "" -"Je kan deze berichten handmatig aan een activiteit koppelen door op de " -"\"Koppel\" knop te drukken, als dat nodig is." +msgid "You can manually match these messages to an activity by clicking the \"Match\" button, if necessary." +msgstr "Je kan deze berichten handmatig aan een activiteit koppelen door op de \"Koppel\" knop te drukken, als dat nodig is." -#: amelie/activities/templates/activities/eventdesk/message_list.html:152 -#: amelie/activities/templates/activities/eventdesk/message_list.html:193 +#: amelie/activities/templates/activities/eventdesk/message_list.html:152 amelie/activities/templates/activities/eventdesk/message_list.html:193 msgid "Start/end time" msgstr "Start/eindtijd" -#: amelie/activities/templates/activities/eventdesk/message_list.html:153 -#: amelie/activities/templates/activities/eventdesk/message_list.html:194 -#: amelie/calendar/models.py:107 +#: amelie/activities/templates/activities/eventdesk/message_list.html:153 amelie/activities/templates/activities/eventdesk/message_list.html:194 amelie/calendar/models.py:107 msgid "Location" msgstr "Locatie" -#: amelie/activities/templates/activities/eventdesk/message_list.html:155 -#: amelie/activities/templates/activities/eventdesk/message_list.html:168 +#: amelie/activities/templates/activities/eventdesk/message_list.html:155 amelie/activities/templates/activities/eventdesk/message_list.html:168 msgid "Match" msgstr "Koppelen" @@ -1577,11 +1049,8 @@ msgid "All Messages" msgstr "Alle Berichten" #: amelie/activities/templates/activities/eventdesk/message_list.html:186 -msgid "" -"These are the past 50 messages that we have received from the event desk." -msgstr "" -"Dit zijn de afgelopen 50 berichten die we hebben ontvangen van het " -"evenementenbureau." +msgid "These are the past 50 messages that we have received from the event desk." +msgstr "Dit zijn de afgelopen 50 berichten die we hebben ontvangen van het evenementenbureau." #: amelie/activities/templates/activities/eventdesk/message_list.html:196 msgid "Matched?" @@ -1601,35 +1070,27 @@ msgid "Dear board" msgstr "Hallo bestuur" #: amelie/activities/templates/activitiesupdate.mail:7 -msgid "" -"In the following two weeks, there are activities in the I/A/ calendar which " -"take place outside of business hours:" -msgstr "" -"De aankomende twee weken zijn er deze activiteiten in de I/A/-Agenda te " -"vinden die buiten kantooruren vallen:" +msgid "In the following two weeks, there are activities in the I/A/ calendar which take place outside of business hours:" +msgstr "De aankomende twee weken zijn er deze activiteiten in de I/A/-Agenda te vinden die buiten kantooruren vallen:" #: amelie/activities/templates/activitiesupdate.mail:10 #, python-format msgid "" "\n" -"
  • %(summary)s from %(begin)s until %(end)s - Reservation status: " -"%(registered)s
  • \n" +"
  • %(summary)s from %(begin)s until %(end)s - Reservation status: %(registered)s
  • \n" " " msgstr "" "\n" -"
  • %(summary)s van %(begin)s tot %(end)s - Reservering status: " -"%(registered)s
  • " +"
  • %(summary)s van %(begin)s tot %(end)s - Reservering status: %(registered)s
  • " #: amelie/activities/templates/activitiesupdate.mail:15 #, python-format msgid "" "\n" -"* %(summary)s from %(begin)s until %(end)s - Reservation status: " -"%(registered)s\n" +"* %(summary)s from %(begin)s until %(end)s - Reservation status: %(registered)s\n" msgstr "" "\n" -"* %(summary)s van %(begin)s tot %(end)s - Reservering status: " -"%(registered)s\n" +"* %(summary)s van %(begin)s tot %(end)s - Reservering status: %(registered)s\n" #: amelie/activities/templates/activitiesupdate.mail:18 #, python-format @@ -1640,8 +1101,7 @@ msgid "" "Kind regards,\n" "The activity assistant" msgstr "" -"Bekijk ook de complete lijst hier: https://www.inter-actief.utwente.nl/" -"activiteiten/\n" +"Bekijk ook de complete lijst hier: https://www.inter-actief.utwente.nl/activiteiten/\n" "En de reserveringen voor de komende twee weken hier: %(url)s\n" "\n" "Met vriendelijke groet,\n" @@ -1655,33 +1115,23 @@ msgstr "Wijzig inschrijfopties" msgid "The board can remove activities." msgstr "Het bestuur kan activiteiten verwijderen." -#: amelie/activities/templates/activity.html:51 -#: amelie/companies/templates/companies/company_event.html:30 -#: amelie/education/templates/education_event.html:29 +#: amelie/activities/templates/activity.html:51 amelie/companies/templates/companies/company_event.html:30 amelie/education/templates/education_event.html:29 msgid "Who, what, where, when..." msgstr "Wie, wat, waar, wanneer..." -#: amelie/activities/templates/activity.html:74 -#: amelie/activities/templates/activity_list.html:13 -#: amelie/companies/templates/companies/company_event.html:59 -#: amelie/companies/templates/companies/company_event_list.html:10 -#: amelie/members/templates/committee.html:66 +#: amelie/activities/templates/activity.html:74 amelie/activities/templates/activity_list.html:13 amelie/companies/templates/companies/company_event.html:59 amelie/companies/templates/companies/company_event_list.html:10 amelie/members/templates/committee.html:66 msgid "iCal-file with activity." msgstr "iCal-document met activiteit." -#: amelie/activities/templates/activity.html:76 -#: amelie/activities/templates/activity_list.html:34 +#: amelie/activities/templates/activity.html:76 amelie/activities/templates/activity_list.html:34 msgid "Label" msgstr "Type" -#: amelie/activities/templates/activity.html:79 -#: amelie/activities/templates/activity_enrollment_form.html:79 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:48 +#: amelie/activities/templates/activity.html:79 amelie/activities/templates/activity_enrollment_form.html:79 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:48 msgid "Costs" msgstr "Kosten" -#: amelie/activities/templates/activity.html:82 -#: amelie/members/templates/members/yeartransfer_prolonged.mail:11 +#: amelie/activities/templates/activity.html:82 amelie/members/templates/members/yeartransfer_prolonged.mail:11 msgid "free" msgstr "gratis" @@ -1698,12 +1148,8 @@ msgid "Export enrollments" msgstr "Exporteer inschrijvingen" #: amelie/activities/templates/activity.html:146 -msgid "" -"Warning: You are exporting enrollments while they are still open! Changes " -"might happen after the export." -msgstr "" -"Let op: Je exporteert de inschrijvingen terwijl de inschrijving nog open is! " -"Er kunnen nog dingen veranderen na de export." +msgid "Warning: You are exporting enrollments while they are still open! Changes might happen after the export." +msgstr "Let op: Je exporteert de inschrijvingen terwijl de inschrijving nog open is! Er kunnen nog dingen veranderen na de export." #: amelie/activities/templates/activity.html:149 msgid "Deanonymise enrollment list" @@ -1717,30 +1163,19 @@ msgstr "Exporteer inschrijvingen (CSV)" msgid "Print enrollments" msgstr "Print inschrijvingen" -#: amelie/activities/templates/activity.html:153 -#: amelie/members/templates/includes/query/query_results.html:16 -#: amelie/tools/templates/data_export_statistics.html:5 -#: amelie/tools/templates/data_export_statistics.html:10 +#: amelie/activities/templates/activity.html:153 amelie/members/templates/includes/query/query_results.html:16 amelie/tools/templates/data_export_statistics.html:5 amelie/tools/templates/data_export_statistics.html:10 msgid "Data export statistics" msgstr "Data-exportstatistieken" -#: amelie/activities/templates/activity.html:165 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:192 +#: amelie/activities/templates/activity.html:165 amelie/personal_tab/templates/cookie_corner_statistics.html:192 msgid "Enrollments" msgstr "Inschrijvingen" -#: amelie/activities/templates/activity_confirm_delete.html:4 -#: amelie/activities/templates/activity_confirm_delete.html:8 -#: amelie/companies/templates/companies/company_confirm_delete.html:4 -#: amelie/companies/templates/companies/company_confirm_delete.html:8 -#: amelie/education/templates/education_event_delete.html:4 -#: amelie/education/templates/education_event_delete.html:8 +#: amelie/activities/templates/activity_confirm_delete.html:4 amelie/activities/templates/activity_confirm_delete.html:8 amelie/companies/templates/companies/company_confirm_delete.html:4 amelie/companies/templates/companies/company_confirm_delete.html:8 amelie/education/templates/education_event_delete.html:4 amelie/education/templates/education_event_delete.html:8 msgid "Confirmation delete" msgstr "Bevestiging verwijdering" -#: amelie/activities/templates/activity_confirm_delete.html:11 -#: amelie/companies/templates/companies/company_confirm_delete.html:11 -#: amelie/education/templates/education_event_delete.html:11 +#: amelie/activities/templates/activity_confirm_delete.html:11 amelie/companies/templates/companies/company_confirm_delete.html:11 amelie/education/templates/education_event_delete.html:11 #, python-format msgid "" "\n" @@ -1752,8 +1187,7 @@ msgstr "" #: amelie/activities/templates/activity_confirm_delete.html:16 msgid "All enrollments will be deleted and the transactions will be undone" -msgstr "" -"Alle inschrijvingen worden verwijderd en de transacties ongedaan gemaakt." +msgstr "Alle inschrijvingen worden verwijderd en de transacties ongedaan gemaakt." #: amelie/activities/templates/activity_confirm_unenrollment.html:4 msgid "Confirmation of unenrollment" @@ -1773,8 +1207,7 @@ msgstr "" "\n" "Weet je zeker dat je %(person)s wil uitschrijven voor %(obj)s?" -#: amelie/activities/templates/activity_enrollment_form.html:5 -#: amelie/activities/templates/activity_enrollment_form.html:16 +#: amelie/activities/templates/activity_enrollment_form.html:5 amelie/activities/templates/activity_enrollment_form.html:16 msgid "Enroll for" msgstr "Inschrijven voor" @@ -1806,90 +1239,44 @@ msgid "The enrollment fee is" msgstr "De inschrijfkosten bedragen" #: amelie/activities/templates/activity_enrollment_form.html:39 -msgid "" -"Unfortunately, there are no more openings. You will be enrolled on the " -"waiting list." -msgstr "" -"Helaas, maar er is geen beschikbare plek meer. Je kunt je wel inschrijven op " -"de wachtlijst." +msgid "Unfortunately, there are no more openings. You will be enrolled on the waiting list." +msgstr "Helaas, maar er is geen beschikbare plek meer. Je kunt je wel inschrijven op de wachtlijst." #: amelie/activities/templates/activity_enrollment_form.html:51 msgid "" "\n" -" The activity has a few enrollment options. " -"Please fill these out before you enroll.\n" +" The activity has a few enrollment options. Please fill these out before you enroll.\n" "\t\t\t\t\t\t Warning: some of these options may cost extra!\n" " " msgstr "" "\n" -"Bij deze activiteit horen enkele inschrijfopties. Vul deze in voordat je je " -"inschrijft.\n" +"Bij deze activiteit horen enkele inschrijfopties. Vul deze in voordat je je inschrijft.\n" "Let op: aan sommige opties kunnen extra kosten verbonden zijn!" #: amelie/activities/templates/activity_enrollment_form.html:84 #, python-format msgid "" "\n" -" It is assumed that %(name)s has given their " -"permission to be enrolled.\n" +" It is assumed that %(name)s has given their permission to be enrolled.\n" " " msgstr "" "\n" -"Er wordt vanuit gegaan dat %(name)s toestemming heeft gegeven om zich te " -"laten inschrijven." +"Er wordt vanuit gegaan dat %(name)s toestemming heeft gegeven om zich te laten inschrijven." #: amelie/activities/templates/activity_enrollment_form.html:93 msgid "" "\n" -" By pressing the sign-up-button, I declare to be " -"aware that any enrollment costs will be\n" -" taken from my bank account through direct debit " -"by Inter-Actief in accordance with\n" -" the authorization I granted for consumptions and " -"activities.\n" +" By pressing the sign-up-button, I declare to be aware that any enrollment costs will be\n" +" taken from my bank account through direct debit by Inter-Actief in accordance with\n" +" the authorization I granted for consumptions and activities.\n" " " msgstr "" "\n" -"Door op de knop inschrijven te klikken verklaar ik dat ik op de hoogte ben " -"van het feit dat (eventuele)\n" -"inschrijfkosten door Inter-Actief van mijn rekening zullen worden " -"afschreven conform de door\n" +"Door op de knop inschrijven te klikken verklaar ik dat ik op de hoogte ben van het feit dat (eventuele)\n" +"inschrijfkosten door Inter-Actief van mijn rekening zullen worden afschreven conform de door\n" "mij getekende machtiging voor consumpties en activiteiten." -#: amelie/activities/templates/activity_enrollment_form.html:102 -#: amelie/activities/templates/activity_enrollment_overview.html:142 -#: amelie/activities/templates/activity_enrollment_print.html:73 -#: amelie/members/templates/statistics/overview.html:26 -#: amelie/members/templates/statistics/overview.html:115 -#: amelie/members/templates/statistics/payments.html:19 -#: amelie/personal_tab/templates/cookie_corner_balance.html:47 -#: amelie/personal_tab/templates/cookie_corner_balance.html:77 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:124 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:165 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:220 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:268 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:303 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:359 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:393 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:439 -#: amelie/personal_tab/templates/exports/screen.html:82 -#: amelie/personal_tab/templates/lists/activity_transactions.html:56 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:42 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:48 -#: amelie/personal_tab/templates/lists/custom_transactions.html:42 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:50 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:48 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:21 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:50 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:38 -#: amelie/personal_tab/templates/lists/transactions.html:44 -#: amelie/personal_tab/templates/lists/transactions_totals.html:25 -#: amelie/personal_tab/templates/lists/transactions_totals.html:56 -#: amelie/personal_tab/templates/pos/shop.html:107 -#: amelie/personal_tab/templates/wrapped.html:142 -#: amelie/personal_tab/templates/wrapped.html:181 -#: amelie/room_duty/templates/room_duty/table/overview.html:142 -#: amelie/room_duty/templates/room_duty/table/overview.html:176 +#: amelie/activities/templates/activity_enrollment_form.html:102 amelie/activities/templates/activity_enrollment_overview.html:142 amelie/activities/templates/activity_enrollment_print.html:73 amelie/members/templates/statistics/overview.html:26 amelie/members/templates/statistics/overview.html:115 amelie/members/templates/statistics/payments.html:19 amelie/personal_tab/templates/cookie_corner_balance.html:47 amelie/personal_tab/templates/cookie_corner_balance.html:77 amelie/personal_tab/templates/cookie_corner_statistics.html:124 amelie/personal_tab/templates/cookie_corner_statistics.html:165 amelie/personal_tab/templates/cookie_corner_statistics.html:220 amelie/personal_tab/templates/cookie_corner_statistics.html:268 amelie/personal_tab/templates/cookie_corner_statistics.html:303 amelie/personal_tab/templates/cookie_corner_statistics.html:359 amelie/personal_tab/templates/cookie_corner_statistics.html:393 amelie/personal_tab/templates/cookie_corner_statistics.html:439 amelie/personal_tab/templates/exports/screen.html:82 amelie/personal_tab/templates/lists/activity_transactions.html:56 amelie/personal_tab/templates/lists/alexia_transactions.html:42 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:48 amelie/personal_tab/templates/lists/custom_transactions.html:42 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:50 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:48 amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:21 amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:50 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:38 amelie/personal_tab/templates/lists/transactions.html:44 amelie/personal_tab/templates/lists/transactions_totals.html:25 amelie/personal_tab/templates/lists/transactions_totals.html:56 amelie/personal_tab/templates/pos/shop.html:107 amelie/personal_tab/templates/wrapped.html:142 amelie/personal_tab/templates/wrapped.html:181 amelie/room_duty/templates/room_duty/table/overview.html:142 amelie/room_duty/templates/room_duty/table/overview.html:176 msgid "Total" msgstr "Totaal" @@ -1897,9 +1284,7 @@ msgstr "Totaal" msgid "Update" msgstr "Aanpassen" -#: amelie/activities/templates/activity_enrollment_form.html:106 -#: amelie/activities/templates/activity_enrollment_person_search.html:30 -#: amelie/activities/templates/includes/activity_enrollment.html:130 +#: amelie/activities/templates/activity_enrollment_form.html:106 amelie/activities/templates/activity_enrollment_person_search.html:30 amelie/activities/templates/includes/activity_enrollment.html:130 msgid "Enroll" msgstr "Inschrijven" @@ -1926,43 +1311,30 @@ msgstr "" #: amelie/activities/templates/activity_enrollment_mandate.html:20 msgid "" "\n" -"\t\t\t\t \tUnfortunately, you cannot enroll for this activity, because it " -"has an entrance fee, and you have\n" -" not signed a direct debit mandate for consumptions and " -"activities. Without this authorization, we\n" -" can not withdraw money from your account. Please ask the " -"board for a mandate form.\n" +"\t\t\t\t \tUnfortunately, you cannot enroll for this activity, because it has an entrance fee, and you have\n" +" not signed a direct debit mandate for consumptions and activities. Without this authorization, we\n" +" can not withdraw money from your account. Please ask the board for a mandate form.\n" "\t\t\t\t" msgstr "" "\n" -"Je kunt je helaas niet inschrijven voor deze activiteit omdat aan deze " -"activiteit kosten verbonden\n" -"zijn en je geen machtiging getekend hebt inzake consumpties en activiteiten. " -"Zonder deze machtiging\n" -"is het niet mogelijk om eventuele kosten af te schrijven. Vraag bij het " -"bestuur om een\n" +"Je kunt je helaas niet inschrijven voor deze activiteit omdat aan deze activiteit kosten verbonden\n" +"zijn en je geen machtiging getekend hebt inzake consumpties en activiteiten. Zonder deze machtiging\n" +"is het niet mogelijk om eventuele kosten af te schrijven. Vraag bij het bestuur om een\n" "machtigingsformulier." #: amelie/activities/templates/activity_enrollment_mandate.html:28 msgid "" "\n" -"\t\t Would you prefer not to sign a direct debit mandate? Please " -"contact the board or organizing committee\n" +"\t\t Would you prefer not to sign a direct debit mandate? Please contact the board or organizing committee\n" " and pay in cash.\n" "\t\t " msgstr "" "\n" -"Liever geen machtiging tekenen? Neem dan contact op met het bestuur of de " -"organiserende commissie en betaal contant." +"Liever geen machtiging tekenen? Neem dan contact op met het bestuur of de organiserende commissie en betaal contant." #: amelie/activities/templates/activity_enrollment_overview.html:19 -msgid "" -"For privacy reasons, this page only shows anonymized enrollment data. For " -"more detailed information please export or print it." -msgstr "" -"Op deze pagina vind je vanwege privacyoverwegingen alleen geanonimiseerde " -"inschrijfgegevens. Voor meer gedetailleerde informatie moet je een export " -"maken of de inschrijvingen printen." +msgid "For privacy reasons, this page only shows anonymized enrollment data. For more detailed information please export or print it." +msgstr "Op deze pagina vind je vanwege privacyoverwegingen alleen geanonimiseerde inschrijfgegevens. Voor meer gedetailleerde informatie moet je een export maken of de inschrijvingen printen." #: amelie/activities/templates/activity_enrollment_overview.html:25 msgid "Number of total participants including waiting list" @@ -1988,83 +1360,51 @@ msgstr "Heb je een lijst met minderjarige deelnemers nodig? Vraag het bestuur!" msgid "You are currently only viewing underage participants!" msgstr "Je bekijkt nu alleen minderjarige deelnemers!" -#: amelie/activities/templates/activity_enrollment_overview.html:59 -#: amelie/activities/templates/activity_enrollment_overview.html:177 -#: amelie/personal_tab/models.py:323 +#: amelie/activities/templates/activity_enrollment_overview.html:59 amelie/activities/templates/activity_enrollment_overview.html:177 amelie/personal_tab/models.py:323 msgid "Sequence" msgstr "Volgorde" -#: amelie/activities/templates/activity_enrollment_overview.html:66 -#: amelie/activities/templates/activity_enrollment_overview.html:184 +#: amelie/activities/templates/activity_enrollment_overview.html:66 amelie/activities/templates/activity_enrollment_overview.html:184 msgid "Enrollment #" msgstr "Inschrijving #" -#: amelie/activities/templates/activity_enrollment_overview.html:74 -#: amelie/members/models.py:856 -#: amelie/members/templates/person_membership.html:36 +#: amelie/activities/templates/activity_enrollment_overview.html:74 amelie/members/models.py:856 amelie/members/templates/person_membership.html:36 msgid "Payment" msgstr "Betaling" -#: amelie/activities/templates/activity_enrollment_overview.html:93 -#: amelie/activities/templates/activity_enrollment_overview.html:95 +#: amelie/activities/templates/activity_enrollment_overview.html:93 amelie/activities/templates/activity_enrollment_overview.html:95 msgid "This participant turns 18 during the activity!" msgstr "Deze deelnemer wordt 18 tijdens de activiteit!" #: amelie/activities/templates/activity_enrollment_overview.html:107 -msgid "" -"By clicking here, you confirm to have received the full amount of money." -msgstr "" -"Door hier te klikken, bevestig je het complete contante bedrag ontvangen te " -"hebben." +msgid "By clicking here, you confirm to have received the full amount of money." +msgstr "Door hier te klikken, bevestig je het complete contante bedrag ontvangen te hebben." #: amelie/activities/templates/activity_enrollment_overview.html:107 msgid "Register cash payment" msgstr "Registreer contante betaling" -#: amelie/activities/templates/activity_enrollment_overview.html:114 -#: amelie/activities/templates/activity_enrollment_overview.html:223 -#: amelie/activities/templates/includes/activity_enrollment.html:87 +#: amelie/activities/templates/activity_enrollment_overview.html:114 amelie/activities/templates/activity_enrollment_overview.html:223 amelie/activities/templates/includes/activity_enrollment.html:87 msgid "Edit enrollment" msgstr "Inschrijving aanpassen" -#: amelie/activities/templates/activity_enrollment_overview.html:119 -#: amelie/activities/templates/activity_enrollment_overview.html:228 -#: amelie/activities/templates/activity_enrollment_print.html:53 -#: amelie/activities/templates/includes/activity_enrollment.html:85 +#: amelie/activities/templates/activity_enrollment_overview.html:119 amelie/activities/templates/activity_enrollment_overview.html:228 amelie/activities/templates/activity_enrollment_print.html:53 amelie/activities/templates/includes/activity_enrollment.html:85 msgid "Deregister" msgstr "Uitschrijven" -#: amelie/activities/templates/activity_enrollment_overview.html:133 -#: amelie/activities/templates/activity_enrollment_print.html:66 +#: amelie/activities/templates/activity_enrollment_overview.html:133 amelie/activities/templates/activity_enrollment_print.html:66 msgid "Order totals" msgstr "Totalen bestellingen" -#: amelie/activities/templates/activity_enrollment_overview.html:136 -#: amelie/activities/templates/activity_enrollment_print.html:69 +#: amelie/activities/templates/activity_enrollment_overview.html:136 amelie/activities/templates/activity_enrollment_print.html:69 msgid "Dish" msgstr "Gerecht" -#: amelie/activities/templates/activity_enrollment_overview.html:136 -#: amelie/activities/templates/activity_enrollment_print.html:69 -#: amelie/members/templates/statistics/overview.html:17 -#: amelie/members/templates/statistics/overview.html:106 -#: amelie/personal_tab/models.py:200 -#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:31 -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:18 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:61 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:107 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:148 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:290 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:380 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:417 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:12 -#: amelie/personal_tab/templates/pos/success.html:35 -#: amelie/personal_tab/templates/wrapped.html:65 +#: amelie/activities/templates/activity_enrollment_overview.html:136 amelie/activities/templates/activity_enrollment_print.html:69 amelie/members/templates/statistics/overview.html:17 amelie/members/templates/statistics/overview.html:106 amelie/personal_tab/models.py:200 amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:31 amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:18 amelie/personal_tab/templates/cookie_corner_statistics.html:61 amelie/personal_tab/templates/cookie_corner_statistics.html:107 amelie/personal_tab/templates/cookie_corner_statistics.html:148 amelie/personal_tab/templates/cookie_corner_statistics.html:290 amelie/personal_tab/templates/cookie_corner_statistics.html:380 amelie/personal_tab/templates/cookie_corner_statistics.html:417 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:12 amelie/personal_tab/templates/pos/success.html:35 amelie/personal_tab/templates/wrapped.html:65 msgid "Amount" msgstr "Aantal" -#: amelie/activities/templates/activity_enrollment_overview.html:136 -#: amelie/activities/templates/activity_enrollment_print.html:69 +#: amelie/activities/templates/activity_enrollment_overview.html:136 amelie/activities/templates/activity_enrollment_print.html:69 msgid "Total price" msgstr "Totale prijs" @@ -2072,22 +1412,15 @@ msgstr "Totale prijs" msgid "Grand Total" msgstr "Eindtotaal" -#: amelie/activities/templates/activity_enrollment_overview.html:152 -#: amelie/activities/templates/activity_enrollment_print.html:81 +#: amelie/activities/templates/activity_enrollment_overview.html:152 amelie/activities/templates/activity_enrollment_print.html:81 msgid "Enroll people" msgstr "Personen inschrijven" -#: amelie/activities/templates/activity_enrollment_overview.html:157 -#: amelie/activities/templates/activity_enrollment_print.html:87 -#: amelie/members/templates/includes/query/query_mailing.html:4 -#: amelie/members/templates/includes/query/query_mailing.html:66 -#: amelie/members/templates/includes/query/query_mailing.html:144 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:46 +#: amelie/activities/templates/activity_enrollment_overview.html:157 amelie/activities/templates/activity_enrollment_print.html:87 amelie/members/templates/includes/query/query_mailing.html:4 amelie/members/templates/includes/query/query_mailing.html:66 amelie/members/templates/includes/query/query_mailing.html:144 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:46 msgid "Send mailing" msgstr "Mailing versturen" -#: amelie/activities/templates/activity_enrollment_overview.html:162 -#: amelie/activities/templates/activity_enrollment_print.html:92 +#: amelie/activities/templates/activity_enrollment_overview.html:162 amelie/activities/templates/activity_enrollment_print.html:92 msgid "View transactions" msgstr "Transacties bekijken" @@ -2121,14 +1454,8 @@ msgstr "" "Persoon inschrijven voor %(name)s" #: amelie/activities/templates/activity_enrollment_print.html:18 -msgid "" -"This enrollment list contains personal data. Please do not leave this lying " -"around somewhere and make sure that it is destroyed after use. If you find " -"this list somewhere, please give it to the board of Inter-Actief." -msgstr "" -"Deze inschrijflijst bevat persoonsgegevens. Laat deze a.u.b. niet slingeren " -"en zorg dat deze naderhand wordt vernietigd. Mocht u deze lijst vinden, geef " -"deze dan aan het bestuur van Inter-Actief." +msgid "This enrollment list contains personal data. Please do not leave this lying around somewhere and make sure that it is destroyed after use. If you find this list somewhere, please give it to the board of Inter-Actief." +msgstr "Deze inschrijflijst bevat persoonsgegevens. Laat deze a.u.b. niet slingeren en zorg dat deze naderhand wordt vernietigd. Mocht u deze lijst vinden, geef deze dan aan het bestuur van Inter-Actief." #: amelie/activities/templates/activity_enrollment_print.html:21 msgid "Number of participants" @@ -2154,21 +1481,11 @@ msgstr "Alle komende activiteiten weergeven" msgid "Show only activities with open enrollments" msgstr "Alleen activiteiten met open inschrijvingen weergeven" -#: amelie/activities/templates/activity_list.html:47 -#: amelie/activities/templates/activity_old.html:43 -#: amelie/companies/templates/companies/company_event_list.html:29 -#: amelie/companies/templates/companies/company_event_list.html:81 +#: amelie/activities/templates/activity_list.html:47 amelie/activities/templates/activity_old.html:43 amelie/companies/templates/companies/company_event_list.html:29 amelie/companies/templates/companies/company_event_list.html:81 msgid "iCal document with activity" msgstr "iCal-document met activiteit" -#: amelie/activities/templates/activity_list.html:65 -#: amelie/activities/templates/activity_list.html:66 -#: amelie/activities/templates/activity_list.html:118 -#: amelie/calendar/models.py:112 -#: amelie/companies/templates/companies/company_event_list.html:36 -#: amelie/companies/templates/companies/company_event_list.html:86 -#: templates/frontpage.html:28 templates/frontpage.html:54 -#: templates/frontpage.html:55 +#: amelie/activities/templates/activity_list.html:65 amelie/activities/templates/activity_list.html:66 amelie/activities/templates/activity_list.html:118 amelie/calendar/models.py:112 amelie/companies/templates/companies/company_event_list.html:36 amelie/companies/templates/companies/company_event_list.html:86 templates/frontpage.html:28 templates/frontpage.html:54 templates/frontpage.html:55 msgid "Dutch-only" msgstr "Nederlands gesproken" @@ -2180,10 +1497,7 @@ msgstr "Er zijn geen aankomende activiteiten, is het toevallig vakantie?" msgid "UT Event Desk status" msgstr "UT Evenementenbureau status" -#: amelie/activities/templates/activity_list.html:98 -#: amelie/companies/templates/companies/company_event_list.html:66 -#: amelie/education/templates/education_event_overview.html:58 -#: templates/slider.html:3 +#: amelie/activities/templates/activity_list.html:98 amelie/companies/templates/companies/company_event_list.html:66 amelie/education/templates/education_event_overview.html:58 templates/slider.html:3 msgid "Past activities" msgstr "Afgelopen activiteiten" @@ -2191,24 +1505,11 @@ msgstr "Afgelopen activiteiten" msgid "Old events" msgstr "Oude activiteiten" -#: amelie/activities/templates/activity_old.html:15 amelie/claudia/forms.py:19 -#: amelie/claudia/templates/claudia/mapping_detail.html:126 -#: amelie/claudia/templates/claudia/mapping_detail.html:181 -#: amelie/claudia/templates/claudia/mapping_list.html:10 -#: amelie/claudia/templates/claudia/mapping_list.html:36 -#: amelie/companies/templates/companies/company_event_old.html:15 -#: amelie/education/templates/summaries.html:15 amelie/members/forms.py:300 -#: amelie/members/templates/query.html:34 -#: amelie/members/templates/query.html:54 -#: amelie/members/templates/query.html:67 -#: amelie/members/templates/registration_check.html:21 -#: amelie/personal_tab/forms.py:123 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:52 +#: amelie/activities/templates/activity_old.html:15 amelie/claudia/forms.py:19 amelie/claudia/templates/claudia/mapping_detail.html:126 amelie/claudia/templates/claudia/mapping_detail.html:181 amelie/claudia/templates/claudia/mapping_list.html:10 amelie/claudia/templates/claudia/mapping_list.html:36 amelie/companies/templates/companies/company_event_old.html:15 amelie/education/templates/summaries.html:15 amelie/members/forms.py:300 amelie/members/templates/query.html:34 amelie/members/templates/query.html:54 amelie/members/templates/query.html:67 amelie/members/templates/registration_check.html:21 amelie/personal_tab/forms.py:123 amelie/personal_tab/templates/cookie_corner_authorization_list.html:52 msgid "Search" msgstr "Zoek" -#: amelie/activities/templates/activity_old.html:23 -#: amelie/companies/templates/companies/company_event_old.html:23 +#: amelie/activities/templates/activity_old.html:23 amelie/companies/templates/companies/company_event_old.html:23 #, python-format msgid "" "\n" @@ -2226,13 +1527,11 @@ msgstr "Meerprijs:" msgid "Discount" msgstr "Korting:" -#: amelie/activities/templates/forms/enrollmentoption_checkbox_answer.html:28 -#: amelie/activities/templates/forms/enrollmentoption_numeric_answer.html:28 +#: amelie/activities/templates/forms/enrollmentoption_checkbox_answer.html:28 amelie/activities/templates/forms/enrollmentoption_numeric_answer.html:28 msgid "spot(s) left" msgstr "plek(ken) over" -#: amelie/activities/templates/forms/enrollmentoption_foodquestion_answer.html:17 -#: amelie/activities/templates/forms/enrollmentoption_question_answer.html:16 +#: amelie/activities/templates/forms/enrollmentoption_foodquestion_answer.html:17 amelie/activities/templates/forms/enrollmentoption_question_answer.html:16 msgid "required" msgstr "verplicht" @@ -2252,14 +1551,11 @@ msgstr "Het maximum per persoon is " msgid "All albums" msgstr "Alle albums" -#: amelie/activities/templates/gallery.html:24 -#: amelie/activities/templates/gallery_overview.html:186 +#: amelie/activities/templates/gallery.html:24 amelie/activities/templates/gallery_overview.html:186 msgid "More photos are available if you" msgstr "Meer foto's zijn beschikbaar als je bent " -#: amelie/activities/templates/gallery.html:24 -#: amelie/activities/templates/gallery_overview.html:187 -#: amelie/videos/templates/videos/videos.html:34 +#: amelie/activities/templates/gallery.html:24 amelie/activities/templates/gallery_overview.html:187 amelie/videos/templates/videos/videos.html:34 msgid "logged in" msgstr "ingelogd" @@ -2278,8 +1574,7 @@ msgstr "Gelukkig hebben we de foto's nog" #: amelie/activities/templates/gallery_overview.html:176 msgid "" "\n" -" Inter-Actief regularly makes photos during " -"activities.\n" +" Inter-Actief regularly makes photos during activities.\n" " This is done by the MedIA committee.\n" " Here you can find photos of the recent activities.\n" " " @@ -2293,8 +1588,7 @@ msgstr "" msgid "Search for pictures" msgstr "Zoeken naar foto's" -#: amelie/activities/templates/gallery_overview.html:204 -#: amelie/activities/templates/gallery_overview.html:206 +#: amelie/activities/templates/gallery_overview.html:204 amelie/activities/templates/gallery_overview.html:206 msgid "albums" msgstr "albums" @@ -2305,10 +1599,8 @@ msgstr "Foto-archief" #: amelie/activities/templates/gallery_overview.html:245 msgid "" "\n" -" The photo archive with photos from 2000 till " -"march 2009 can be found on\n" -" foto." -"inter-actief.net.\n" +" The photo archive with photos from 2000 till march 2009 can be found on\n" +" foto.inter-actief.net.\n" " " msgstr "" "\n" @@ -2325,8 +1617,7 @@ msgstr "Fotograaf: " #: amelie/activities/templates/gallery_photo.html:29 msgid "If you want to have this photo removed, please contact the board" -msgstr "" -"Als je deze foto wilt laten verwijderen, neem dan contact op met het bestuur" +msgstr "Als je deze foto wilt laten verwijderen, neem dan contact op met het bestuur" #: amelie/activities/templates/gallery_photo.html:33 msgid "Original" @@ -2347,8 +1638,7 @@ msgstr "Groot" #: amelie/activities/templates/includes/activity_enrollment.html:7 msgid "" "\n" -" For this activity there is no maximum number of " -"participants\n" +" For this activity there is no maximum number of participants\n" " " msgstr "" "\n" @@ -2357,8 +1647,7 @@ msgstr "" #: amelie/activities/templates/includes/activity_enrollment.html:11 msgid "" "\n" -" If you want to be at this activity, you need to " -"enroll.\n" +" If you want to be at this activity, you need to enroll.\n" " " msgstr "" "\n" @@ -2394,8 +1683,7 @@ msgstr "" #, python-format msgid "" "\n" -" For this activity, there are %(places)s places " -"left.\n" +" For this activity, there are %(places)s places left.\n" " " msgstr "" "\n" @@ -2423,8 +1711,7 @@ msgstr "" #, python-format msgid "" "\n" -" You can enroll for this activity until %(enddate)s at " -"%(endtime)s.\n" +" You can enroll for this activity until %(enddate)s at %(endtime)s.\n" " " msgstr "" "\n" @@ -2433,8 +1720,7 @@ msgstr "" #: amelie/activities/templates/includes/activity_enrollment.html:48 msgid "" "\n" -" The maximum number of participants for this activity has " -"been reached.\n" +" The maximum number of participants for this activity has been reached.\n" " " msgstr "" "\n" @@ -2444,24 +1730,19 @@ msgstr "" msgid "You have enrolled yourself for this event." msgstr "Je hebt je ingeschreven voor deze activiteit." -#: amelie/activities/templates/includes/activity_enrollment.html:61 -#: amelie/activities/templates/includes/activity_enrollment.html:154 +#: amelie/activities/templates/includes/activity_enrollment.html:61 amelie/activities/templates/includes/activity_enrollment.html:154 msgid "You are enrolled on the waiting list for this event." msgstr "Je hebt je ingeschreven voor deze activiteit op de wachtlijst." #: amelie/activities/templates/includes/activity_enrollment.html:65 msgid "You are on the waiting list for this event with the following options:" -msgstr "" -"Je hebt je ingeschreven voor deze activiteit op de wachtlijst met de " -"volgende inschrijfopties:" +msgstr "Je hebt je ingeschreven voor deze activiteit op de wachtlijst met de volgende inschrijfopties:" #: amelie/activities/templates/includes/activity_enrollment.html:67 msgid "You have enrolled for this event with the following options:" -msgstr "" -"Je hebt je ingeschreven voor deze activiteit met de volgende inschrijfopties:" +msgstr "Je hebt je ingeschreven voor deze activiteit met de volgende inschrijfopties:" -#: amelie/activities/templates/includes/activity_enrollment.html:78 -#: amelie/activities/templates/includes/activity_enrollment.html:155 +#: amelie/activities/templates/includes/activity_enrollment.html:78 amelie/activities/templates/includes/activity_enrollment.html:155 msgid "Your spot on the waiting list is" msgstr "Jouw plek op de wachtlijst is" @@ -2473,8 +1754,7 @@ msgstr "Uitschrijven van de wachtlijst" #, python-format msgid "" "\n" -" You can reverse your enrollment till %(date)s at " -"%(time)s.\n" +" You can reverse your enrollment till %(date)s at %(time)s.\n" " " msgstr "" "\n" @@ -2482,9 +1762,7 @@ msgstr "" #: amelie/activities/templates/includes/activity_enrollment.html:98 msgid "For this activity, you can only unenroll yourself at the board." -msgstr "" -"Voor deze activiteit kun je jezelf alleen uitschrijven indien je contact met " -"het bestuur opneemt." +msgstr "Voor deze activiteit kun je jezelf alleen uitschrijven indien je contact met het bestuur opneemt." #: amelie/activities/templates/includes/activity_enrollment.html:103 msgid "" @@ -2498,8 +1776,7 @@ msgstr "" #: amelie/activities/templates/includes/activity_enrollment.html:111 msgid "" "\n" -" It's not possible to unenroll yourself for this " -"activity.\n" +" It's not possible to unenroll yourself for this activity.\n" " " msgstr "" "\n" @@ -2508,19 +1785,15 @@ msgstr "" #: amelie/activities/templates/includes/activity_enrollment.html:119 msgid "" "\n" -" You can no longer enroll, all placed have been " -"filled.
    \n" -" Do you want to be on the waiting list? That is " -"still possible!
    \n" -" When on the waiting list, you will be automatically " -"enrolled as soon as someone unenrolls.\n" +" You can no longer enroll, all placed have been filled.
    \n" +" Do you want to be on the waiting list? That is still possible!
    \n" +" When on the waiting list, you will be automatically enrolled as soon as someone unenrolls.\n" " " msgstr "" "\n" "Je kunt je niet meer inschrijven, alle plaatsen zijn vergeven.
    \n" "Wil je op de reservelijst? Dat is nog wel mogelijk!
    \n" -"Wanneer je op de wachtlijst staat, word je vanzelf ingeschreven wanneer er " -"plek is." +"Wanneer je op de wachtlijst staat, word je vanzelf ingeschreven wanneer er plek is." #: amelie/activities/templates/includes/activity_enrollment.html:130 msgid "Place on waiting list" @@ -2530,44 +1803,33 @@ msgstr "Plaats op wachtlijst" #, python-format msgid "" "\n" -" To view or alter your enrollment, please log in.\n" +" To view or alter your enrollment, please log in.\n" " " msgstr "" "\n" -"Om je inschrijving te bekijken of te wijzigen moet je inloggen." +"Om je inschrijving te bekijken of te wijzigen moet je inloggen." #: amelie/activities/templates/includes/activity_enrollment.html:147 msgid "You can only enroll for this activity on the website of this activity" -msgstr "" -"Je kan je voor deze activiteit alleen inschrijven via de website van deze " -"activiteit" +msgstr "Je kan je voor deze activiteit alleen inschrijven via de website van deze activiteit" -#: amelie/activities/templates/includes/activity_enrollment.html:151 -#: amelie/activities/templates/includes/activity_list_enrollment.html:5 +#: amelie/activities/templates/includes/activity_enrollment.html:151 amelie/activities/templates/includes/activity_list_enrollment.html:5 msgid "You have enrolled for this event" msgstr "Je hebt je ingeschreven voor deze activiteit" #: amelie/activities/templates/includes/activity_enrollment.html:158 -msgid "" -"Unfortunately, you cannot enroll for this activity anymore, as the " -"enrollment period has ended." -msgstr "" -"Je kunt je helaas niet meer inschrijven voor deze activiteit, de " -"inschrijftermijn is verlopen." +msgid "Unfortunately, you cannot enroll for this activity anymore, as the enrollment period has ended." +msgstr "Je kunt je helaas niet meer inschrijven voor deze activiteit, de inschrijftermijn is verlopen." #: amelie/activities/templates/includes/activity_enrollment.html:162 #, python-format msgid "" "\n" -" The enrollment for this activity has not been opened yet. " -"You can enroll from %(enrollment_begin)s until %(enrollment_end)s.\n" +" The enrollment for this activity has not been opened yet. You can enroll from %(enrollment_begin)s until %(enrollment_end)s.\n" " " msgstr "" "\n" -"De inschrijving is helaas nog niet geopend voor deze activiteit. Van " -"%(enrollment_begin)s tot %(enrollment_end)s kun je je inschrijven." +"De inschrijving is helaas nog niet geopend voor deze activiteit. Van %(enrollment_begin)s tot %(enrollment_end)s kun je je inschrijven." #: amelie/activities/templates/includes/activity_list_enrollment.html:7 msgid "You are on the waiting list" @@ -2590,103 +1852,36 @@ msgstr "Schrijf je nu in!" msgid "Subscription is open from %(date)s" msgstr "Inschrijven kan vanaf %(date)s" -#: amelie/activities/templates/includes/gallery_paginator.html:5 -#: amelie/activities/templates/includes/gallery_paginator.html:8 -#: amelie/activities/templates/includes/gallery_photo_paginator.html:6 -#: amelie/activities/templates/includes/photo_overview_paginator.html:5 -#: amelie/activities/templates/includes/photo_overview_paginator.html:8 -#: amelie/education/templates/includes/education_news_paginator.html:5 -#: amelie/education/templates/includes/education_news_paginator.html:8 -#: amelie/members/templates/includes/query/query_results.html:30 -#: amelie/members/templates/includes/query/query_results.html:81 -#: amelie/news/templates/includes/news_paginator.html:5 -#: amelie/news/templates/includes/news_paginator.html:8 -#: amelie/publications/templates/publications/includes/publications_paginator.html:5 -#: amelie/publications/templates/publications/includes/publications_paginator.html:8 -#: amelie/tools/templates/paginator.html:6 -#: amelie/videos/templates/videos/includes/videos_paginator.html:5 -#: amelie/videos/templates/videos/includes/videos_paginator.html:8 +#: amelie/activities/templates/includes/gallery_paginator.html:5 amelie/activities/templates/includes/gallery_paginator.html:8 amelie/activities/templates/includes/gallery_photo_paginator.html:6 amelie/activities/templates/includes/photo_overview_paginator.html:5 amelie/activities/templates/includes/photo_overview_paginator.html:8 amelie/education/templates/includes/education_news_paginator.html:5 amelie/education/templates/includes/education_news_paginator.html:8 amelie/members/templates/includes/query/query_results.html:30 amelie/members/templates/includes/query/query_results.html:81 amelie/news/templates/includes/news_paginator.html:5 amelie/news/templates/includes/news_paginator.html:8 amelie/publications/templates/publications/includes/publications_paginator.html:5 amelie/publications/templates/publications/includes/publications_paginator.html:8 amelie/tools/templates/paginator.html:6 amelie/videos/templates/videos/includes/videos_paginator.html:5 amelie/videos/templates/videos/includes/videos_paginator.html:8 msgid "First" msgstr "Eerste" -#: amelie/activities/templates/includes/gallery_paginator.html:6 -#: amelie/activities/templates/includes/gallery_paginator.html:9 -#: amelie/activities/templates/includes/gallery_photo_paginator.html:7 -#: amelie/activities/templates/includes/photo_overview_paginator.html:6 -#: amelie/activities/templates/includes/photo_overview_paginator.html:9 -#: amelie/education/templates/includes/education_news_paginator.html:6 -#: amelie/education/templates/includes/education_news_paginator.html:9 -#: amelie/members/templates/includes/query/query_push.html:23 -#: amelie/members/templates/includes/query/query_results.html:31 -#: amelie/members/templates/includes/query/query_results.html:82 -#: amelie/news/templates/includes/news_paginator.html:6 -#: amelie/news/templates/includes/news_paginator.html:9 -#: amelie/publications/templates/publications/includes/publications_paginator.html:6 -#: amelie/publications/templates/publications/includes/publications_paginator.html:9 -#: amelie/tools/templates/paginator.html:7 -#: amelie/videos/templates/videos/includes/videos_paginator.html:6 -#: amelie/videos/templates/videos/includes/videos_paginator.html:9 +#: amelie/activities/templates/includes/gallery_paginator.html:6 amelie/activities/templates/includes/gallery_paginator.html:9 amelie/activities/templates/includes/gallery_photo_paginator.html:7 amelie/activities/templates/includes/photo_overview_paginator.html:6 amelie/activities/templates/includes/photo_overview_paginator.html:9 amelie/education/templates/includes/education_news_paginator.html:6 amelie/education/templates/includes/education_news_paginator.html:9 amelie/members/templates/includes/query/query_push.html:23 amelie/members/templates/includes/query/query_results.html:31 amelie/members/templates/includes/query/query_results.html:82 amelie/news/templates/includes/news_paginator.html:6 amelie/news/templates/includes/news_paginator.html:9 amelie/publications/templates/publications/includes/publications_paginator.html:6 amelie/publications/templates/publications/includes/publications_paginator.html:9 amelie/tools/templates/paginator.html:7 amelie/videos/templates/videos/includes/videos_paginator.html:6 amelie/videos/templates/videos/includes/videos_paginator.html:9 msgid "Back" msgstr "Vorige" -#: amelie/activities/templates/includes/gallery_paginator.html:21 -#: amelie/activities/templates/includes/gallery_paginator.html:24 -#: amelie/activities/templates/includes/gallery_photo_paginator.html:11 -#: amelie/activities/templates/includes/photo_overview_paginator.html:22 -#: amelie/activities/templates/includes/photo_overview_paginator.html:25 -#: amelie/education/templates/includes/education_news_paginator.html:21 -#: amelie/education/templates/includes/education_news_paginator.html:24 -#: amelie/members/templates/includes/query/query_results.html:45 -#: amelie/members/templates/includes/query/query_results.html:96 -#: amelie/news/templates/includes/news_paginator.html:21 -#: amelie/news/templates/includes/news_paginator.html:24 -#: amelie/publications/templates/publications/includes/publications_paginator.html:21 -#: amelie/publications/templates/publications/includes/publications_paginator.html:24 -#: amelie/tools/templates/paginator.html:23 -#: amelie/videos/templates/videos/includes/videos_paginator.html:21 -#: amelie/videos/templates/videos/includes/videos_paginator.html:24 +#: amelie/activities/templates/includes/gallery_paginator.html:21 amelie/activities/templates/includes/gallery_paginator.html:24 amelie/activities/templates/includes/gallery_photo_paginator.html:11 amelie/activities/templates/includes/photo_overview_paginator.html:22 amelie/activities/templates/includes/photo_overview_paginator.html:25 amelie/education/templates/includes/education_news_paginator.html:21 amelie/education/templates/includes/education_news_paginator.html:24 amelie/members/templates/includes/query/query_results.html:45 amelie/members/templates/includes/query/query_results.html:96 amelie/news/templates/includes/news_paginator.html:21 amelie/news/templates/includes/news_paginator.html:24 amelie/publications/templates/publications/includes/publications_paginator.html:21 amelie/publications/templates/publications/includes/publications_paginator.html:24 amelie/tools/templates/paginator.html:23 amelie/videos/templates/videos/includes/videos_paginator.html:21 amelie/videos/templates/videos/includes/videos_paginator.html:24 msgid "Next" msgstr "Volgende" -#: amelie/activities/templates/includes/gallery_paginator.html:22 -#: amelie/activities/templates/includes/gallery_paginator.html:25 -#: amelie/activities/templates/includes/gallery_photo_paginator.html:12 -#: amelie/activities/templates/includes/photo_overview_paginator.html:23 -#: amelie/activities/templates/includes/photo_overview_paginator.html:26 -#: amelie/education/templates/includes/education_news_paginator.html:22 -#: amelie/education/templates/includes/education_news_paginator.html:25 -#: amelie/members/templates/includes/query/query_results.html:46 -#: amelie/members/templates/includes/query/query_results.html:97 -#: amelie/news/templates/includes/news_paginator.html:22 -#: amelie/news/templates/includes/news_paginator.html:25 -#: amelie/publications/templates/publications/includes/publications_paginator.html:22 -#: amelie/publications/templates/publications/includes/publications_paginator.html:25 -#: amelie/tools/templates/paginator.html:24 -#: amelie/videos/templates/videos/includes/videos_paginator.html:22 -#: amelie/videos/templates/videos/includes/videos_paginator.html:25 +#: amelie/activities/templates/includes/gallery_paginator.html:22 amelie/activities/templates/includes/gallery_paginator.html:25 amelie/activities/templates/includes/gallery_photo_paginator.html:12 amelie/activities/templates/includes/photo_overview_paginator.html:23 amelie/activities/templates/includes/photo_overview_paginator.html:26 amelie/education/templates/includes/education_news_paginator.html:22 amelie/education/templates/includes/education_news_paginator.html:25 amelie/members/templates/includes/query/query_results.html:46 amelie/members/templates/includes/query/query_results.html:97 amelie/news/templates/includes/news_paginator.html:22 amelie/news/templates/includes/news_paginator.html:25 amelie/publications/templates/publications/includes/publications_paginator.html:22 amelie/publications/templates/publications/includes/publications_paginator.html:25 amelie/tools/templates/paginator.html:24 amelie/videos/templates/videos/includes/videos_paginator.html:22 amelie/videos/templates/videos/includes/videos_paginator.html:25 msgid "Last" msgstr "Laatste" -#: amelie/activities/templates/photo_upload.html:4 -#: amelie/activities/templates/photo_upload.html:8 -#: amelie/activities/templates/photo_upload_files.html:4 -#: amelie/activities/templates/photo_upload_files.html:8 +#: amelie/activities/templates/photo_upload.html:4 amelie/activities/templates/photo_upload.html:8 amelie/activities/templates/photo_upload_files.html:4 amelie/activities/templates/photo_upload_files.html:8 msgid "Upload photos" msgstr "Foto's uploaden" #: amelie/activities/templates/photo_upload.html:13 msgid "" "\n" -"\t\t\t\t\t\tIf needed you can still uncheck a photo. After uploading photos " -"will be moved to the website\n" -" and will no longer be available in the " -"uploadfolder.\n" +"\t\t\t\t\t\tIf needed you can still uncheck a photo. After uploading photos will be moved to the website\n" +" and will no longer be available in the uploadfolder.\n" "\t\t\t\t\t" msgstr "" "\n" "Je kunt eventueel nog een foto uitvinken, mocht dat nodig zijn.\n" -"De fotos worden verplaatst en zijn na het uploaden niet meer beschikbaar in " -"de uploadmap." +"De fotos worden verplaatst en zijn na het uploaden niet meer beschikbaar in de uploadmap." #: amelie/activities/templates/photo_upload.html:34 msgid "Upload selected photos" @@ -2708,13 +1903,7 @@ msgstr "Maak uploadmap leeg" msgid "Clear photo upload directory" msgstr "Maak foto uploadmap leeg" -#: amelie/activities/templates/photo_upload_clear_confirm.html:8 -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:4 -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:10 -#: amelie/claudia/templates/claudia/confirm_add.html:4 -#: amelie/claudia/templates/claudia/confirm_add.html:10 -#: amelie/claudia/templates/claudia/confirm_delete.html:4 -#: amelie/claudia/templates/claudia/confirm_delete.html:10 +#: amelie/activities/templates/photo_upload_clear_confirm.html:8 amelie/claudia/templates/claudia/add_to_mapping_confirm.html:4 amelie/claudia/templates/claudia/add_to_mapping_confirm.html:10 amelie/claudia/templates/claudia/confirm_add.html:4 amelie/claudia/templates/claudia/confirm_add.html:10 amelie/claudia/templates/claudia/confirm_delete.html:4 amelie/claudia/templates/claudia/confirm_delete.html:10 msgid "Confirmation" msgstr "Bevestiging" @@ -2736,34 +1925,23 @@ msgstr "Foto's uploaden" #: amelie/activities/utils.py:34 #, python-brace-format -msgid "" -"Enrollment for {activity} is not possible. You do not have an active " -"membership at Inter-Actief" -msgstr "" -"Inschrijven voor {activity} is niet mogelijk. Je hebt geen actief " -"lidmaatschap bij Inter-Actief." +msgid "Enrollment for {activity} is not possible. You do not have an active membership at Inter-Actief" +msgstr "Inschrijven voor {activity} is niet mogelijk. Je hebt geen actief lidmaatschap bij Inter-Actief." -#: amelie/activities/utils.py:43 amelie/activities/utils.py:101 -#: amelie/activities/utils.py:133 +#: amelie/activities/utils.py:43 amelie/activities/utils.py:101 amelie/activities/utils.py:133 #, python-brace-format msgid "Unenrollment for {activity} is not possible." msgstr "Uitschrijven voor {activity} is niet mogelijk." #: amelie/activities/utils.py:50 #, python-brace-format -msgid "" -"Enrollment for {activity} is only possible on the website of this activity." -msgstr "" -"Inschrijven voor {activity} is alleen mogelijk op de website van deze " -"activiteit." +msgid "Enrollment for {activity} is only possible on the website of this activity." +msgstr "Inschrijven voor {activity} is alleen mogelijk op de website van deze activiteit." #: amelie/activities/utils.py:58 #, python-brace-format -msgid "" -"The enrollment period for {activity} hasn't started yet or has already " -"passed." -msgstr "" -"De inschrijfperiode voor {activity} is nog niet begonnen of is al voorbij." +msgid "The enrollment period for {activity} hasn't started yet or has already passed." +msgstr "De inschrijfperiode voor {activity} is nog niet begonnen of is al voorbij." #: amelie/activities/utils.py:66 #, python-brace-format @@ -2777,11 +1955,8 @@ msgstr "Je bent al ingeschreven voor {activity}." #: amelie/activities/utils.py:108 #, python-brace-format -msgid "" -"Unenrollment for {activity} is only possible on the website of this activity." -msgstr "" -"Uitschrijven voor {activity} is alleen mogelijk op de website van deze " -"activiteit." +msgid "Unenrollment for {activity} is only possible on the website of this activity." +msgstr "Uitschrijven voor {activity} is alleen mogelijk op de website van deze activiteit." #: amelie/activities/utils.py:120 #, python-brace-format @@ -2801,9 +1976,7 @@ msgstr "De uitschrijfperiode voor {activity} is al voorbij." #: amelie/activities/utils.py:164 #, python-brace-format msgid "{person} has been promoted from the waiting list for {activity}." -msgstr "" -"{person} is gepromoveerd van de wachtlijst naar bevestigde deelname voor " -"{activity}." +msgstr "{person} is gepromoveerd van de wachtlijst naar bevestigde deelname voor {activity}." #: amelie/activities/views.py:97 msgid "Events of Inter-Actief" @@ -2851,8 +2024,7 @@ msgstr "Je bent nu ingeschreven voor {waiting_list} {activity}." msgid "The photos are being uploaded. This might take while." msgstr "De foto's worden verwerkt. Dit kan even duren." -#: amelie/activities/views.py:751 amelie/activities/views.py:756 -#: amelie/activities/views.py:760 amelie/activities/views.py:788 +#: amelie/activities/views.py:751 amelie/activities/views.py:756 amelie/activities/views.py:760 amelie/activities/views.py:788 msgid "This picture does not exist." msgstr "Deze foto bestaat niet." @@ -2877,19 +2049,12 @@ msgid "You did not fill in a Dutch summary/description." msgstr "Je hebt geen Nederlandse samenvatting/omschrijving ingevuld." #: amelie/activities/views.py:1119 amelie/activities/views.py:1129 -msgid "" -"This activity already has enrollments, therefore options can no longer be " -"added!" -msgstr "" -"Deze activiteit heeft inschrijvingen, er kunnen geen opties toegevoegd " -"worden!" +msgid "This activity already has enrollments, therefore options can no longer be added!" +msgstr "Deze activiteit heeft inschrijvingen, er kunnen geen opties toegevoegd worden!" #: amelie/activities/views.py:1168 amelie/activities/views.py:1182 -msgid "" -"This activity already has enrollments, therefore options cannot be deleted!" -msgstr "" -"Deze activiteit heeft inschrijvingen, er kunnen geen opties verwijderd " -"worden!" +msgid "This activity already has enrollments, therefore options cannot be deleted!" +msgstr "Deze activiteit heeft inschrijvingen, er kunnen geen opties verwijderd worden!" #: amelie/activities/views.py:1174 #, python-format @@ -2898,37 +2063,25 @@ msgstr "Inschrijfoptie %(object)s is verwijderd" #: amelie/activities/views.py:1195 msgid "Only accessible for the board and the organisers of this activity." -msgstr "" -"Uitsluitend toegankelijk voor het bestuur en de organisators van de " -"activiteit." +msgstr "Uitsluitend toegankelijk voor het bestuur en de organisators van de activiteit." #: amelie/activities/views.py:1201 amelie/activities/views.py:1215 msgid "No activity found or invalid activity ID given." -msgstr "" -"Geen activiteit gevonden of je hebt een ongeldige activiteit-id meegegeven." +msgstr "Geen activiteit gevonden of je hebt een ongeldige activiteit-id meegegeven." #: amelie/activities/views.py:1210 msgid "Invalid activity ID" msgstr "Ongeldige activiteit-id." #: amelie/activities/views.py:1231 amelie/personal_tab/views.py:1357 -msgid "" -"Could not create data export, because an unknown data-exporttype is provided." -msgstr "" -"Kon geen data-export maken, omdat er een onbekend data-exporttype is " -"opegeven." +msgid "Could not create data export, because an unknown data-exporttype is provided." +msgstr "Kon geen data-export maken, omdat er een onbekend data-exporttype is opegeven." -#: amelie/activities/views.py:1238 amelie/members/query_views.py:237 -#: amelie/personal_tab/views.py:1364 -msgid "" -"Could not create data export, because something went wrong while saving " -"information about the export." -msgstr "" -"Kon geen data-export maken, omdat er iets mis ging bij het opslaan van " -"gegevens over de data-export." +#: amelie/activities/views.py:1238 amelie/members/query_views.py:237 amelie/personal_tab/views.py:1364 +msgid "Could not create data export, because something went wrong while saving information about the export." +msgstr "Kon geen data-export maken, omdat er iets mis ging bij het opslaan van gegevens over de data-export." -#: amelie/activities/views.py:1314 amelie/activities/views.py:1324 -#: amelie/activities/views.py:1326 +#: amelie/activities/views.py:1314 amelie/activities/views.py:1324 amelie/activities/views.py:1326 msgid "You are not allowed to edit this activity" msgstr "Je mag deze activiteit niet bewerken" @@ -2938,8 +2091,7 @@ msgstr "Er is een onbekende fout opgetreden." #: amelie/activities/views.py:1381 amelie/activities/views.py:1396 msgid "Message is not encoded in UTF-8, Latin-1 or ASCII, giving up..." -msgstr "" -"Bericht is niet geëncodeerd in UTF-8, Latin-1 of ASCII, ik geef het op..." +msgstr "Bericht is niet geëncodeerd in UTF-8, Latin-1 of ASCII, ik geef het op..." #: amelie/activities/views.py:1402 msgid "Could not retrieve this message from Google. {}" @@ -2953,23 +2105,16 @@ msgstr "Pushnotificatie" msgid "Push Notifications" msgstr "Pushnotificaties" -#: amelie/blame/templates/blame/blame_changelog.html:5 -#: amelie/blame/templates/blame/blame_detail.html:5 -#: amelie/blame/templates/blame/model_overview.html:5 -#: amelie/blame/templates/blame/overview.html:4 +#: amelie/blame/templates/blame/blame_changelog.html:5 amelie/blame/templates/blame/blame_detail.html:5 amelie/blame/templates/blame/model_overview.html:5 amelie/blame/templates/blame/overview.html:4 msgid "Blame" msgstr "Blame" -#: amelie/blame/templates/blame/blame_changelog.html:5 -#: amelie/blame/templates/blame/blame_changelog.html:10 +#: amelie/blame/templates/blame/blame_changelog.html:5 amelie/blame/templates/blame/blame_changelog.html:10 #, python-format msgid "Log for %(modelname)s %(objectname)s" msgstr "Logboek voor %(modelname)s %(objectname)s" -#: amelie/blame/templates/blame/blame_changelog.html:14 -#: amelie/blame/templates/blame/blame_detail.html:20 -#: amelie/blame/templates/blame/model_overview.html:13 -#: amelie/blame/templates/blame/overview.html:8 +#: amelie/blame/templates/blame/blame_changelog.html:14 amelie/blame/templates/blame/blame_detail.html:20 amelie/blame/templates/blame/model_overview.html:13 amelie/blame/templates/blame/overview.html:8 msgid "Blame overview" msgstr "Blame-overzicht" @@ -2977,46 +2122,31 @@ msgstr "Blame-overzicht" msgid "Model overview" msgstr "Modeloverzicht" -#: amelie/blame/templates/blame/blame_changelog.html:23 -#: amelie/blame/templates/blame/blame_detail.html:43 -#: amelie/blame/templates/blame/model_overview.html:19 +#: amelie/blame/templates/blame/blame_changelog.html:23 amelie/blame/templates/blame/blame_detail.html:43 amelie/blame/templates/blame/model_overview.html:19 msgid "Object" msgstr "Object" -#: amelie/blame/templates/blame/blame_changelog.html:24 -#: amelie/blame/templates/blame/blame_detail.html:57 -#: amelie/blame/templates/blame/model_overview.html:20 -#: amelie/claudia/templates/claudia/extrapersonalalias_list.html:30 +#: amelie/blame/templates/blame/blame_changelog.html:24 amelie/blame/templates/blame/blame_detail.html:57 amelie/blame/templates/blame/model_overview.html:20 amelie/claudia/templates/claudia/extrapersonalalias_list.html:30 msgid "Action" msgstr "Actie" -#: amelie/blame/templates/blame/blame_changelog.html:25 -#: amelie/blame/templates/blame/blame_detail.html:29 -#: amelie/blame/templates/blame/model_overview.html:21 -#: amelie/tools/models.py:46 -#: amelie/tools/templates/data_export_statistics.html:26 +#: amelie/blame/templates/blame/blame_changelog.html:25 amelie/blame/templates/blame/blame_detail.html:29 amelie/blame/templates/blame/model_overview.html:21 amelie/tools/models.py:46 amelie/tools/templates/data_export_statistics.html:26 msgid "Timestamp" msgstr "Tijdstempel" -#: amelie/blame/templates/blame/blame_changelog.html:26 -#: amelie/blame/templates/blame/blame_detail.html:62 -#: amelie/blame/templates/blame/model_overview.html:22 +#: amelie/blame/templates/blame/blame_changelog.html:26 amelie/blame/templates/blame/blame_detail.html:62 amelie/blame/templates/blame/model_overview.html:22 msgid "Changes" msgstr "Wijzigingen" -#: amelie/blame/templates/blame/blame_changelog.html:27 -#: amelie/blame/templates/blame/model_overview.html:23 +#: amelie/blame/templates/blame/blame_changelog.html:27 amelie/blame/templates/blame/model_overview.html:23 msgid "Changed by" msgstr "Gewijzigd door" -#: amelie/blame/templates/blame/blame_changelog.html:33 -#: amelie/blame/templates/blame/blame_detail.html:46 -#: amelie/blame/templates/blame/model_overview.html:29 +#: amelie/blame/templates/blame/blame_changelog.html:33 amelie/blame/templates/blame/blame_detail.html:46 amelie/blame/templates/blame/model_overview.html:29 msgid "Detail page of this object" msgstr "Detailpagina van dit object" -#: amelie/blame/templates/blame/blame_changelog.html:35 -#: amelie/blame/templates/blame/model_overview.html:31 +#: amelie/blame/templates/blame/blame_changelog.html:35 amelie/blame/templates/blame/model_overview.html:31 msgid "No detail page found for this object" msgstr "Geen detailpagina gevonden voor dit object" @@ -3024,25 +2154,19 @@ msgstr "Geen detailpagina gevonden voor dit object" msgid "Details of this change" msgstr "Details van deze wijziging" -#: amelie/blame/templates/blame/blame_changelog.html:43 -#: amelie/blame/templates/blame/blame_detail.html:35 -#: amelie/blame/templates/blame/model_overview.html:40 +#: amelie/blame/templates/blame/blame_changelog.html:43 amelie/blame/templates/blame/blame_detail.html:35 amelie/blame/templates/blame/model_overview.html:40 msgid "System" msgstr "Systeem" -#: amelie/blame/templates/blame/blame_changelog.html:45 -#: amelie/blame/templates/blame/blame_detail.html:37 -#: amelie/blame/templates/blame/model_overview.html:42 +#: amelie/blame/templates/blame/blame_changelog.html:45 amelie/blame/templates/blame/blame_detail.html:37 amelie/blame/templates/blame/model_overview.html:42 msgid "Anonymous" msgstr "Anoniem" -#: amelie/blame/templates/blame/blame_changelog.html:52 -#: amelie/blame/templates/blame/model_overview.html:49 +#: amelie/blame/templates/blame/blame_changelog.html:52 amelie/blame/templates/blame/model_overview.html:49 msgid "No changes recorded" msgstr "Geen wijzigingen opgeslagen" -#: amelie/blame/templates/blame/blame_detail.html:5 -#: amelie/blame/templates/blame/blame_detail.html:25 +#: amelie/blame/templates/blame/blame_detail.html:5 amelie/blame/templates/blame/blame_detail.html:25 #, python-format msgid "Change to %(actual_obj)s" msgstr "Wijziging aan %(actual_obj)s" @@ -3070,9 +2194,7 @@ msgstr "Door" msgid "Object type" msgstr "Objecttype" -#: amelie/blame/templates/blame/blame_detail.html:64 -#: amelie/blame/templatetags/blame_tags.py:44 -#: amelie/blame/templatetags/blame_tags.py:61 +#: amelie/blame/templates/blame/blame_detail.html:64 amelie/blame/templatetags/blame_tags.py:44 amelie/blame/templatetags/blame_tags.py:61 msgid "This object has been removed." msgstr "Dit object is verwijderd." @@ -3094,9 +2216,7 @@ msgstr "Alle wijzigingen van dit object bekijken" msgid "Detail page for this change" msgstr "Detailpagina van deze wijziging" -#: amelie/blame/templates/blame/overview.html:4 -#: amelie/room_duty/templates/room_duty/table/overview.html:6 -#: amelie/room_duty/templates/room_duty/table/overview.html:86 +#: amelie/blame/templates/blame/overview.html:4 amelie/room_duty/templates/room_duty/table/overview.html:6 amelie/room_duty/templates/room_duty/table/overview.html:86 msgid "Overview" msgstr "Overzicht" @@ -3116,51 +2236,15 @@ msgstr "Geen betaling" msgid "Cash at the board/committee" msgstr "Contant bij bestuur/commissie" -#: amelie/calendar/models.py:24 amelie/members/query_forms.py:82 -#: amelie/members/templates/includes/query/query_mandate.html:4 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:4 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:8 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:36 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:92 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:49 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:11 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:10 +#: amelie/calendar/models.py:24 amelie/members/query_forms.py:82 amelie/members/templates/includes/query/query_mandate.html:4 amelie/personal_tab/templates/cookie_corner_authorization_view.html:4 amelie/personal_tab/templates/cookie_corner_authorization_view.html:8 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:36 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:92 amelie/personal_tab/templates/cookie_corner_process_batch.html:49 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:11 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:10 msgid "Mandate" msgstr "Machtiging" -#: amelie/calendar/models.py:26 amelie/data_export/models.py:31 -#: amelie/education/models.py:288 amelie/members/forms.py:295 -#: amelie/members/models.py:708 amelie/members/models.py:759 -#: amelie/members/models.py:1062 -#: amelie/members/templates/committee_edit_members.html:33 -#: amelie/members/templates/committee_edit_single_member.html:28 -#: amelie/personal_tab/forms.py:114 amelie/personal_tab/forms.py:168 -#: amelie/personal_tab/models.py:123 amelie/personal_tab/models.py:371 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:21 -#: amelie/personal_tab/templates/cookie_corner_balance.html:35 -#: amelie/personal_tab/templates/cookie_corner_balance.html:63 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:23 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:91 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:48 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:325 -#: amelie/personal_tab/templates/info/transaction_information.html:39 -#: amelie/personal_tab/templates/lists/activity_transactions.html:10 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:10 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:10 -#: amelie/personal_tab/templates/lists/custom_transactions.html:10 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:9 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:9 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:10 -#: amelie/personal_tab/templates/lists/transactions.html:10 +#: amelie/calendar/models.py:26 amelie/data_export/models.py:31 amelie/education/models.py:288 amelie/members/forms.py:295 amelie/members/models.py:708 amelie/members/models.py:759 amelie/members/models.py:1062 amelie/members/templates/committee_edit_members.html:33 amelie/members/templates/committee_edit_single_member.html:28 amelie/personal_tab/forms.py:114 amelie/personal_tab/forms.py:168 amelie/personal_tab/models.py:123 amelie/personal_tab/models.py:371 amelie/personal_tab/templates/cookie_corner_authorization_view.html:21 amelie/personal_tab/templates/cookie_corner_balance.html:35 amelie/personal_tab/templates/cookie_corner_balance.html:63 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:23 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:91 amelie/personal_tab/templates/cookie_corner_process_batch.html:48 amelie/personal_tab/templates/cookie_corner_statistics.html:325 amelie/personal_tab/templates/info/transaction_information.html:39 amelie/personal_tab/templates/lists/activity_transactions.html:10 amelie/personal_tab/templates/lists/alexia_transactions.html:10 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:10 amelie/personal_tab/templates/lists/custom_transactions.html:10 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:9 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:9 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:10 amelie/personal_tab/templates/lists/transactions.html:10 msgid "Person" msgstr "Persoon" -#: amelie/calendar/models.py:28 amelie/education/models.py:253 -#: amelie/education/models.py:289 amelie/education/templates/complaint.html:107 -#: amelie/members/models.py:1065 amelie/personal_tab/forms.py:84 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:29 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:70 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:125 +#: amelie/calendar/models.py:28 amelie/education/models.py:253 amelie/education/models.py:289 amelie/education/templates/complaint.html:107 amelie/members/models.py:1065 amelie/personal_tab/forms.py:84 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:29 amelie/personal_tab/templates/cookie_corner_authorization_view.html:70 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:125 msgid "Remarks" msgstr "Opmerking" @@ -3172,13 +2256,11 @@ msgstr "Contante betaling voldaan" msgid "On waiting list" msgstr "Op wachtlijst" -#: amelie/calendar/models.py:34 amelie/personal_tab/models.py:130 -#: amelie/personal_tab/templates/info/transaction_information.html:49 +#: amelie/calendar/models.py:34 amelie/personal_tab/models.py:130 amelie/personal_tab/templates/info/transaction_information.html:49 msgid "Added on" msgstr "Toegevoegd op" -#: amelie/calendar/models.py:37 amelie/personal_tab/models.py:133 -#: amelie/personal_tab/templates/info/transaction_information.html:53 +#: amelie/calendar/models.py:37 amelie/personal_tab/models.py:133 amelie/personal_tab/templates/info/transaction_information.html:53 msgid "Added by" msgstr "Toegevoegd door" @@ -3194,14 +2276,11 @@ msgstr "Deelnames" msgid "deleted activity" msgstr "verwijderde activiteit" -#: amelie/calendar/models.py:88 amelie/education/models.py:133 -#: amelie/room_duty/models.py:40 amelie/room_duty/models.py:104 -#: amelie/room_duty/models.py:201 +#: amelie/calendar/models.py:88 amelie/education/models.py:133 amelie/room_duty/models.py:40 amelie/room_duty/models.py:104 amelie/room_duty/models.py:201 msgid "Starts" msgstr "Begint" -#: amelie/calendar/models.py:89 amelie/education/models.py:134 -#: amelie/room_duty/models.py:105 amelie/room_duty/models.py:202 +#: amelie/calendar/models.py:89 amelie/education/models.py:134 amelie/room_duty/models.py:105 amelie/room_duty/models.py:202 msgid "Ends" msgstr "Eindigt" @@ -3222,47 +2301,10 @@ msgid "Short promotional message" msgstr "Korte promotietekst" #: amelie/calendar/models.py:96 amelie/calendar/models.py:100 -msgid "" -"This text can be used by the board for promotion, for example on our socials " -"or in our weekmail. Let it be a teaser, so people would want to read your " -"full activity description." -msgstr "" -"Deze tekst kan gebruikt worden door het bestuur voor promotie, bijvoorbeeld " -"op onze social media kanalen of in onze weekmail. Laat het een teaser zijn, " -"zodat mensen die geïnteresseerd zijn jouw volledige beschrijving willen " -"lezen." - -#: amelie/calendar/models.py:103 -#: amelie/claudia/templates/claudia/aliasgroup_list.html:23 -#: amelie/claudia/templates/claudia/contact_list.html:22 -#: amelie/claudia/templates/claudia/email_detail.html:18 -#: amelie/claudia/templates/claudia/extragroup_list.html:24 -#: amelie/claudia/templates/claudia/extraperson_list.html:23 -#: amelie/claudia/templates/claudia/mapping_detail.html:86 -#: amelie/claudia/templates/claudia/mapping_detail.html:141 -#: amelie/claudia/templates/claudia/shareddrive_list.html:22 -#: amelie/companies/templates/companies/company_event_form.html:87 -#: amelie/education/templates/education_event_form.html:50 -#: amelie/members/models.py:662 amelie/members/models.py:691 -#: amelie/oauth/templates/oauth_access_request.mail:12 -#: amelie/oauth/templates/request_oauth_sent.html:23 -#: amelie/personal_tab/forms.py:33 amelie/personal_tab/models.py:124 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:118 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:66 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:22 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:21 -#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:16 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:326 -#: amelie/personal_tab/templates/info/debt_collection_instructions.html:18 -#: amelie/personal_tab/templates/info/transaction_information.html:7 -#: amelie/personal_tab/templates/lists/activity_transactions.html:12 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:11 -#: amelie/personal_tab/templates/lists/custom_transactions.html:11 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:11 -#: amelie/personal_tab/templates/lists/transactions.html:11 -#: amelie/personal_tab/templates/wrapped.html:167 -#: amelie/videos/templates/videos/ia_video_form.html:58 -#: amelie/videos/templates/videos/yt_video_form.html:58 +msgid "This text can be used by the board for promotion, for example on our socials or in our weekmail. Let it be a teaser, so people would want to read your full activity description." +msgstr "Deze tekst kan gebruikt worden door het bestuur voor promotie, bijvoorbeeld op onze social media kanalen of in onze weekmail. Laat het een teaser zijn, zodat mensen die geïnteresseerd zijn jouw volledige beschrijving willen lezen." + +#: amelie/calendar/models.py:103 amelie/claudia/templates/claudia/aliasgroup_list.html:23 amelie/claudia/templates/claudia/contact_list.html:22 amelie/claudia/templates/claudia/email_detail.html:18 amelie/claudia/templates/claudia/extragroup_list.html:24 amelie/claudia/templates/claudia/extraperson_list.html:23 amelie/claudia/templates/claudia/mapping_detail.html:86 amelie/claudia/templates/claudia/mapping_detail.html:141 amelie/claudia/templates/claudia/shareddrive_list.html:22 amelie/companies/templates/companies/company_event_form.html:87 amelie/education/templates/education_event_form.html:50 amelie/members/models.py:662 amelie/members/models.py:691 amelie/oauth/templates/oauth_access_request.mail:12 amelie/oauth/templates/request_oauth_sent.html:23 amelie/personal_tab/forms.py:33 amelie/personal_tab/models.py:124 amelie/personal_tab/templates/cookie_corner_authorization_view.html:118 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:66 amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:22 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:21 amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:16 amelie/personal_tab/templates/cookie_corner_statistics.html:326 amelie/personal_tab/templates/info/debt_collection_instructions.html:18 amelie/personal_tab/templates/info/transaction_information.html:7 amelie/personal_tab/templates/lists/activity_transactions.html:12 amelie/personal_tab/templates/lists/alexia_transactions.html:11 amelie/personal_tab/templates/lists/custom_transactions.html:11 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:11 amelie/personal_tab/templates/lists/transactions.html:11 amelie/personal_tab/templates/wrapped.html:167 amelie/videos/templates/videos/ia_video_form.html:58 amelie/videos/templates/videos/yt_video_form.html:58 msgid "Description" msgstr "Omschrijving" @@ -3290,8 +2332,7 @@ msgstr "Callback URL" msgid "URL has to start with https://" msgstr "URL moet met https:// beginnen" -#: amelie/calendar/models.py:182 amelie/education/models.py:159 -#: amelie/room_duty/models.py:117 +#: amelie/calendar/models.py:182 amelie/education/models.py:159 amelie/room_duty/models.py:117 msgid "Start may not be after of simultaneous to end." msgstr "Begin kan niet na het einde voorkomen of gelijk zijn aan het einde." @@ -3307,36 +2348,25 @@ msgstr "Bevestigen betaling" #, python-format msgid "" "\n" -" Are you sure you want to register a cash payment for " -"%(person)s for %(event)s?\n" +" Are you sure you want to register a cash payment for %(person)s for %(event)s?\n" " " msgstr "" "\n" -"Weet je zeker dat je een contante betaling van %(person)s voor %(event)s wil " -"registreren?" +"Weet je zeker dat je een contante betaling van %(person)s voor %(event)s wil registreren?" #: amelie/calendar/views.py:25 -msgid "" -"Payment registered on {timezone.now().strftime('%d-%m-%Y')} by {request.user." -"person.incomplete_name()}" -msgstr "" -"Payment registered on {timezone.now().strftime('%d-%m-%Y')} by {request.user." -"person.incomplete_name()}" +msgid "Payment registered on {timezone.now().strftime('%d-%m-%Y')} by {request.user.person.incomplete_name()}" +msgstr "Payment registered on {timezone.now().strftime('%d-%m-%Y')} by {request.user.person.incomplete_name()}" #: amelie/calendar/views.py:28 msgid "Cash payment registered!" msgstr "Contante betaling geregistreerd!" #: amelie/claudia/account_views.py:54 amelie/claudia/account_views.py:67 -msgid "" -"Enter a correct username and password. Warning: the fields are case-" -"sensitive." -msgstr "" -"Voer een correcte gebruikersnaam en wachtwoord in. Let op, de velden zijn " -"hoofdletter-gevoelig." +msgid "Enter a correct username and password. Warning: the fields are case-sensitive." +msgstr "Voer een correcte gebruikersnaam en wachtwoord in. Let op, de velden zijn hoofdletter-gevoelig." -#: amelie/claudia/account_views.py:69 amelie/claudia/account_views.py:99 -#: amelie/claudia/account_views.py:123 amelie/claudia/account_views.py:148 +#: amelie/claudia/account_views.py:69 amelie/claudia/account_views.py:99 amelie/claudia/account_views.py:123 amelie/claudia/account_views.py:148 msgid "Something went wrong, please contact the system administrators." msgstr "Er ging iets fout. Neem even contact op met Systeembeheer." @@ -3345,18 +2375,10 @@ msgid "Your account has already been activated." msgstr "Je account is al geactiveerd." #: amelie/claudia/account_views.py:125 -msgid "" -"It looks like you have entered an unknown username and password combination. " -"Please contact the administrators if you are sure you entered a correct " -"combination." -msgstr "" -"Het lijkt erop dat je een verkeerde gebruikersnaam of wachtwoord hebt " -"opgegeven. Weet je zeker dat je gegevens correct zijn, neem dan even contact " -"op met Systeembeheer." +msgid "It looks like you have entered an unknown username and password combination. Please contact the administrators if you are sure you entered a correct combination." +msgstr "Het lijkt erop dat je een verkeerde gebruikersnaam of wachtwoord hebt opgegeven. Weet je zeker dat je gegevens correct zijn, neem dan even contact op met Systeembeheer." -#: amelie/claudia/account_views.py:261 amelie/claudia/account_views.py:267 -#: amelie/claudia/account_views.py:274 amelie/claudia/account_views.py:281 -#: amelie/claudia/account_views.py:287 amelie/claudia/account_views.py:294 +#: amelie/claudia/account_views.py:261 amelie/claudia/account_views.py:267 amelie/claudia/account_views.py:274 amelie/claudia/account_views.py:281 amelie/claudia/account_views.py:287 amelie/claudia/account_views.py:294 msgid "This reset code is not valid." msgstr "Deze herstelcode is niet geldig." @@ -3373,48 +2395,28 @@ msgid "Unknown, please disable and re-enable forwarding!" msgstr "Onbekend, zet alsjeblieft forwarding uit en weer aan!" #: amelie/claudia/account_views.py:388 -msgid "" -"Your personal e-mail address is already known with Google. Click below to " -"activate your e-mail forward." -msgstr "" -"Je persoonlijke e-mailadres is al bekend bij Google. Klik hieronder om je e-" -"mailforward te activeren." +msgid "Your personal e-mail address is already known with Google. Click below to activate your e-mail forward." +msgstr "Je persoonlijke e-mailadres is al bekend bij Google. Klik hieronder om je e-mailforward te activeren." #: amelie/claudia/account_views.py:393 -msgid "" -"Your e-mail address has been verified with Google! Click below to activate " -"your e-mail forward." -msgstr "" -"Je e-mailadres is nu geverifiëerd bij Google! Klik hieronder om je e-" -"mailforward te activeren." +msgid "Your e-mail address has been verified with Google! Click below to activate your e-mail forward." +msgstr "Je e-mailadres is nu geverifiëerd bij Google! Klik hieronder om je e-mailforward te activeren." #: amelie/claudia/account_views.py:398 -msgid "" -"Your personal e-mail address is not known yet with Google. This has to be " -"verified first. Click below to start the verification process." -msgstr "" -"Je persoonlijke e-mailadres is not niet bekend bij Google. Deze moet eerst " -"geverifiëerd worden. Klik hieronder om het verificatieproces te starten." +msgid "Your personal e-mail address is not known yet with Google. This has to be verified first. Click below to start the verification process." +msgstr "Je persoonlijke e-mailadres is not niet bekend bij Google. Deze moet eerst geverifiëerd worden. Klik hieronder om het verificatieproces te starten." #: amelie/claudia/account_views.py:402 -msgid "" -"Your e-mail address has not been verified yet. Please check your e-mail for " -"a verification link." -msgstr "" -"Je e-mailadres is nog niet geverifiëerd. Kijk a.u.b. in je e-mail voor een " -"verificatielink." +msgid "Your e-mail address has not been verified yet. Please check your e-mail for a verification link." +msgstr "Je e-mailadres is nog niet geverifiëerd. Kijk a.u.b. in je e-mail voor een verificatielink." #: amelie/claudia/account_views.py:442 msgid "Your forward is now activated!" msgstr "Je forward is nu geactiveerd!" #: amelie/claudia/account_views.py:460 -msgid "" -"Your forward has been deactivated! Don't forget to regularly check your " -"Google Suite e-mail so you don't miss anything important!" -msgstr "" -"Je forward is gedeactiveerd! Vergeet niet regelmatig je Google Suite e-mail " -"te checken zodat je niks belangrijks mist!" +msgid "Your forward has been deactivated! Don't forget to regularly check your Google Suite e-mail so you don't miss anything important!" +msgstr "Je forward is gedeactiveerd! Vergeet niet regelmatig je Google Suite e-mail te checken zodat je niks belangrijks mist!" #: amelie/claudia/claudia_views.py:145 msgid "A Shared Drive can have a maximum of 99 members." @@ -3433,11 +2435,7 @@ msgstr "Ook inactieve mappings" msgid "Types" msgstr "Types" -#: amelie/claudia/forms.py:26 amelie/claudia/forms.py:63 -#: amelie/claudia/templates/claudia/extragroup_list.html:23 -#: amelie/claudia/templates/claudia/mapping_detail.html:49 -#: amelie/members/models.py:336 -#: amelie/members/templates/includes/person_data_table.html:43 +#: amelie/claudia/forms.py:26 amelie/claudia/forms.py:63 amelie/claudia/templates/claudia/extragroup_list.html:23 amelie/claudia/templates/claudia/mapping_detail.html:49 amelie/members/models.py:336 amelie/members/templates/includes/person_data_table.html:43 msgid "Account name" msgstr "Accountnaam" @@ -3445,13 +2443,11 @@ msgstr "Accountnaam" msgid "Current password" msgstr "Huidig wachtwoord" -#: amelie/claudia/forms.py:28 amelie/claudia/forms.py:46 -#: amelie/claudia/forms.py:109 +#: amelie/claudia/forms.py:28 amelie/claudia/forms.py:46 amelie/claudia/forms.py:109 msgid "New password" msgstr "Nieuw wachtwoord" -#: amelie/claudia/forms.py:29 amelie/claudia/forms.py:47 -#: amelie/claudia/forms.py:110 +#: amelie/claudia/forms.py:29 amelie/claudia/forms.py:47 amelie/claudia/forms.py:110 msgid "Repeat new password" msgstr "Herhaal nieuw wachtwoord" @@ -3459,8 +2455,7 @@ msgstr "Herhaal nieuw wachtwoord" msgid "New password must differ from present password" msgstr "Nieuw wachtwoord moet anders zijn dan het huidige wachtwoord" -#: amelie/claudia/forms.py:41 amelie/claudia/forms.py:59 -#: amelie/claudia/forms.py:118 +#: amelie/claudia/forms.py:41 amelie/claudia/forms.py:59 amelie/claudia/forms.py:118 msgid "The new passwords do not match" msgstr "De nieuwe wachtwoorden komen niet overeen" @@ -3468,9 +2463,7 @@ msgstr "De nieuwe wachtwoorden komen niet overeen" msgid "There is no account with that name." msgstr "Er bestaat geen account met die naam." -#: amelie/claudia/forms.py:132 -#: amelie/claudia/templates/claudia/aliasgroup_list.html:4 -#: amelie/claudia/templates/claudia/aliasgroup_list.html:10 +#: amelie/claudia/forms.py:132 amelie/claudia/templates/claudia/aliasgroup_list.html:4 amelie/claudia/templates/claudia/aliasgroup_list.html:10 msgid "Alias groups" msgstr "Aliasgroepen" @@ -3479,26 +2472,16 @@ msgid "This mailaddress is not unique! You might want to make a group." msgstr "Dit mailadres is niet uniek! Misschien wil je een groep aanmaken?" #: amelie/claudia/models.py:37 -msgid "" -"If an email address for an extra group is set, then it may only point to an " -"Inter-Actief server." -msgstr "" -"Als een mail adres voor een extra groep is ingesteld, dan mag deze alleen " -"naar een Inter-Actief server wijzen." +msgid "If an email address for an extra group is set, then it may only point to an Inter-Actief server." +msgstr "Als een mail adres voor een extra groep is ingesteld, dan mag deze alleen naar een Inter-Actief server wijzen." -#: amelie/claudia/models.py:47 amelie/claudia/models.py:153 -#: amelie/claudia/models.py:200 amelie/claudia/models.py:234 -#: amelie/members/models.py:175 amelie/members/models.py:957 +#: amelie/claudia/models.py:47 amelie/claudia/models.py:153 amelie/claudia/models.py:200 amelie/claudia/models.py:234 amelie/members/models.py:175 amelie/members/models.py:957 msgid "This email address is already in use by another mapping!" msgstr "Dit e-mailadres wordt al door een andere mapping gebruikt!" #: amelie/claudia/models.py:143 -msgid "" -"If an extra person has an email than the email address may only point to an " -"Inter-Actief server." -msgstr "" -"Als een extra persoon een mail adres heeft, dan mag deze alleen maar naar " -"een Inter-Actief server wijzen." +msgid "If an extra person has an email than the email address may only point to an Inter-Actief server." +msgstr "Als een extra persoon een mail adres heeft, dan mag deze alleen maar naar een Inter-Actief server wijzen." #: amelie/claudia/models.py:169 msgid "Open to sign up for members" @@ -3529,23 +2512,14 @@ msgid "Activate Inter-Actief active members account" msgstr "Inter-Actief-actieveledenaccount activeren" #: amelie/claudia/templates/accounts/activate.html:10 -msgid "" -"Before you can use your active members account, you must set a password. " -"Please do so below." -msgstr "" -"Voordat je je actieveledenaccount kan gebruiken, moet je eerst zelf een " -"wachtwoord instellen, dat kan hieronder." +msgid "Before you can use your active members account, you must set a password. Please do so below." +msgstr "Voordat je je actieveledenaccount kan gebruiken, moet je eerst zelf een wachtwoord instellen, dat kan hieronder." #: amelie/claudia/templates/accounts/activate.html:11 -msgid "" -"Naturally, your password must differ from the one we gave you, and consist " -"of at least 8 characters." -msgstr "" -"Je nieuwe wachtwoord moet natuurlijk anders zijn dan die wij gegeven hebben " -"en uit minimaal 8 karakters bestaan." +msgid "Naturally, your password must differ from the one we gave you, and consist of at least 8 characters." +msgstr "Je nieuwe wachtwoord moet natuurlijk anders zijn dan die wij gegeven hebben en uit minimaal 8 karakters bestaan." -#: amelie/claudia/templates/accounts/activate.html:22 -#: amelie/claudia/templates/accounts/home.html:12 +#: amelie/claudia/templates/accounts/activate.html:22 amelie/claudia/templates/accounts/home.html:12 msgid "Activate account" msgstr "Account activeren" @@ -3577,10 +2551,7 @@ msgstr "Inter-Actief-account" msgid "Inter-Actief account" msgstr "Inter-Actief-account" -#: amelie/claudia/templates/accounts/home.html:15 -#: amelie/claudia/templates/accounts/password.html:22 -#: amelie/claudia/templates/accounts/password_reset_link.html:22 -#: templates/profile_overview.html:27 +#: amelie/claudia/templates/accounts/home.html:15 amelie/claudia/templates/accounts/password.html:22 amelie/claudia/templates/accounts/password_reset_link.html:22 templates/profile_overview.html:27 msgid "Change password" msgstr "Wachtwoord wijzigen" @@ -3592,89 +2563,51 @@ msgstr "Verander email alias voorkeuren" msgid "Change mail alias preferences " msgstr "Verander email alias voorkeuren" -#: amelie/claudia/templates/accounts/password.html:4 -#: amelie/claudia/templates/accounts/password_reset.html:4 -#: amelie/claudia/templates/accounts/password_reset_link.html:4 -#: amelie/claudia/templates/accounts/password_reset_success.html:4 -#: amelie/claudia/templates/accounts/password_success.html:4 +#: amelie/claudia/templates/accounts/password.html:4 amelie/claudia/templates/accounts/password_reset.html:4 amelie/claudia/templates/accounts/password_reset_link.html:4 amelie/claudia/templates/accounts/password_reset_success.html:4 amelie/claudia/templates/accounts/password_success.html:4 msgid "Change Inter-Actief active members account's password" msgstr "Wachtwoord Inter-Actief-actieveledenaccount wijzigen" -#: amelie/claudia/templates/accounts/password.html:8 -#: amelie/claudia/templates/accounts/password_reset_link.html:8 -#: amelie/claudia/templates/accounts/password_success.html:8 +#: amelie/claudia/templates/accounts/password.html:8 amelie/claudia/templates/accounts/password_reset_link.html:8 amelie/claudia/templates/accounts/password_success.html:8 msgid "Change Inter-Actief active members account's password" msgstr "Wachtwoord Inter-Actief-actieveledenaccount wijzigen" -#: amelie/claudia/templates/accounts/password.html:10 -#: amelie/claudia/templates/accounts/password_reset_link.html:10 -msgid "" -"You can change the password for your Inter-Actief active members " -"account through the form below." -msgstr "" -"Via het onderstaand formulier kun je je wachtwoord voor je Inter-Actief-actieveledenaccount wijzigen." +#: amelie/claudia/templates/accounts/password.html:10 amelie/claudia/templates/accounts/password_reset_link.html:10 +msgid "You can change the password for your Inter-Actief active members account through the form below." +msgstr "Via het onderstaand formulier kun je je wachtwoord voor je Inter-Actief-actieveledenaccount wijzigen." -#: amelie/claudia/templates/accounts/password.html:11 -#: amelie/claudia/templates/accounts/password_reset_link.html:11 -msgid "" -"Your new password must differ from your current one and consist of at least " -"8 characters." -msgstr "" -"Je nieuwe wachtwoord moet natuurlijk anders zijn dan je vorige en uit " -"minimaal 8 karakters bestaan." +#: amelie/claudia/templates/accounts/password.html:11 amelie/claudia/templates/accounts/password_reset_link.html:11 +msgid "Your new password must differ from your current one and consist of at least 8 characters." +msgstr "Je nieuwe wachtwoord moet natuurlijk anders zijn dan je vorige en uit minimaal 8 karakters bestaan." #: amelie/claudia/templates/accounts/password_reset.html:8 msgid "Reset Inter-Actief active members account's password" msgstr "Wachtwoord Inter-Actief-actieveledenaccount wijzigen" #: amelie/claudia/templates/accounts/password_reset.html:11 -msgid "" -"Please fill in your active members account name and we'll send you an e-mail " -"to reset your password." -msgstr "" -"Vul alsjeblieft de gebruikersnaam van je actieveledenaccount in. Je ontvangt " -"dan een e-mail om je wachtwoord opnieuw in te stellen." +msgid "Please fill in your active members account name and we'll send you an e-mail to reset your password." +msgstr "Vul alsjeblieft de gebruikersnaam van je actieveledenaccount in. Je ontvangt dan een e-mail om je wachtwoord opnieuw in te stellen." #: amelie/claudia/templates/accounts/password_reset.mail:3 msgid "Inter-Actief Password Reset" msgstr "Inter-Actief Wachtwoordherstel" #: amelie/claudia/templates/accounts/password_reset.mail:7 -msgid "" -"You are receiving this e-mail because you requested a reset of your password " -"for your Inter-Actief active members account." -msgstr "" -"Je ontvangt deze e-mail omdat je het wachtwoord van je Inter-Actief " -"actieveledenaccount opnieuw wilt instellen." +msgid "You are receiving this e-mail because you requested a reset of your password for your Inter-Actief active members account." +msgstr "Je ontvangt deze e-mail omdat je het wachtwoord van je Inter-Actief actieveledenaccount opnieuw wilt instellen." #: amelie/claudia/templates/accounts/password_reset.mail:9 msgid "You can use the following link to reset your password:" -msgstr "" -"Je kan de volgende link gebruiken om je wachtwoord opnieuw in te stellen:" +msgstr "Je kan de volgende link gebruiken om je wachtwoord opnieuw in te stellen:" #: amelie/claudia/templates/accounts/password_reset.mail:13 -msgid "" -"If you don’t use this link within 3 hours, it will expire. To get a new " -"password reset link, visit " -msgstr "" -"Deze link verloopt over 3 uur. Om een nieuwe herstellink te genereren, " -"bezoek " - -#: amelie/claudia/templates/accounts/password_reset.mail:15 -#: amelie/claudia/templates/claudia/account_created.mail:28 -#: amelie/claudia/templates/claudia/account_deleted.mail:13 -#: amelie/data_export/templates/data_export/mails/export_complete.mail:15 -#: amelie/iamailer/templates/iamailer/report.mail:34 -#: amelie/iamailer/templates/iamailer/report.mail:45 -#: amelie/members/templates/members/datamail_html.mail:11 -#: amelie/tools/templates/tools/push_report.mail:28 -#: amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:26 +msgid "If you don’t use this link within 3 hours, it will expire. To get a new password reset link, visit " +msgstr "Deze link verloopt over 3 uur. Om een nieuwe herstellink te genereren, bezoek " + +#: amelie/claudia/templates/accounts/password_reset.mail:15 amelie/claudia/templates/claudia/account_created.mail:28 amelie/claudia/templates/claudia/account_deleted.mail:13 amelie/data_export/templates/data_export/mails/export_complete.mail:15 amelie/iamailer/templates/iamailer/report.mail:34 amelie/iamailer/templates/iamailer/report.mail:45 amelie/members/templates/members/datamail_html.mail:11 amelie/tools/templates/tools/push_report.mail:28 amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:26 msgid "Kind regards," msgstr "Met vriendelijke groet," -#: amelie/claudia/templates/accounts/password_reset.mail:17 -#: amelie/claudia/templates/claudia/account_created.mail:30 +#: amelie/claudia/templates/accounts/password_reset.mail:17 amelie/claudia/templates/claudia/account_created.mail:30 msgid "Account management" msgstr "Accountbeheer" @@ -3683,91 +2616,46 @@ msgid "Reset e-mail sent" msgstr "Herstelemail verstuurd" #: amelie/claudia/templates/accounts/password_reset_success.html:11 -msgid "" -"Check the email address you have registered at Inter-Actief for a " -"link to reset your password. If it doesn’t appear within a few minutes, " -"check your spam folder." -msgstr "" -"Kijk op het e-mailadres dat je hebt geregistreerd bij Inter-Actief " -"voor een link om je wachtwoord opnieuw in te stellen. Als deze niet binnen " -"een paar minuten aan komt, kijk dan tussen je ongewenste e-mail." +msgid "Check the email address you have registered at Inter-Actief for a link to reset your password. If it doesn’t appear within a few minutes, check your spam folder." +msgstr "Kijk op het e-mailadres dat je hebt geregistreerd bij Inter-Actief voor een link om je wachtwoord opnieuw in te stellen. Als deze niet binnen een paar minuten aan komt, kijk dan tussen je ongewenste e-mail." #: amelie/claudia/templates/accounts/password_reset_success.html:13 msgid "Return to login" msgstr "Terug naar login" #: amelie/claudia/templates/accounts/password_success.html:11 -msgid "" -"The password to your Inter-Actief active members account has been " -"changed." -msgstr "" -"Je wachtwoord van je Inter-Actief-actieveledenaccount is gewijzigd." +msgid "The password to your Inter-Actief active members account has been changed." +msgstr "Je wachtwoord van je Inter-Actief-actieveledenaccount is gewijzigd." #: amelie/claudia/templates/claudia/account_created.mail:3 msgid "Account at Inter-Actief" msgstr "Account bij Inter-Actief" #: amelie/claudia/templates/claudia/account_created.mail:7 -msgid "" -"Since you are/have become an active member of Inter-Actief, an account has " -"been created for you in the Inter-Actief ICT environment." -msgstr "" -"Aangezien je actief bent (geworden) bij Inter-Actief is er voor jou een " -"account aangemaakt in de Inter-Actief ICT omgeving." +msgid "Since you are/have become an active member of Inter-Actief, an account has been created for you in the Inter-Actief ICT environment." +msgstr "Aangezien je actief bent (geworden) bij Inter-Actief is er voor jou een account aangemaakt in de Inter-Actief ICT omgeving." #: amelie/claudia/templates/claudia/account_created.mail:9 -msgid "" -"With this account you can log in to the computers in the Inter-Actief room, " -"you have access to any files on your committee's drives, and you can log in " -"to the Inter-Actief wiki and some other services. (see https://intra.ia." -"utwente.nl/ for an overview.)" -msgstr "" -"Met dit account kan je inloggen op de computers in de Inter-Actiefkamer, heb " -"je toegang tot de bestanden op je commissieschijven, en kan je inloggen op " -"de Inter-Actief wiki en andere services. (zie https://intra.ia.utwente.nl/ " -"voor een overzicht.)" +msgid "With this account you can log in to the computers in the Inter-Actief room, you have access to any files on your committee's drives, and you can log in to the Inter-Actief wiki and some other services. (see https://intra.ia.utwente.nl/ for an overview.)" +msgstr "Met dit account kan je inloggen op de computers in de Inter-Actiefkamer, heb je toegang tot de bestanden op je commissieschijven, en kan je inloggen op de Inter-Actief wiki en andere services. (zie https://intra.ia.utwente.nl/ voor een overzicht.)" #: amelie/claudia/templates/claudia/account_created.mail:11 #, python-format -msgid "" -"With this account you also get an e-mail address and a Google Account on our " -"own Google Suite environment. From now you will also be reachable on " -"%(email)s. To see the e-mails that you receive on this account, you can log " -"in to google with that e-mail address. You will then be redirected to the " -"Inter-Actief website to complete the login." -msgstr "" -"Met dit account krijg je ook een e-mailadres en een Google Account op onze " -"eigen Google Suite-omgeving. Van nu af aan ben je ook te bereiken op " -"%(email)s. Om de e-mails te zien die je op dit account krijgt, kan je bij " -"google inloggen met dat e-mailadres. Je wordt dan doorgestuurd naar de Inter-" -"Actiefwebsite om de login te voltooien." +msgid "With this account you also get an e-mail address and a Google Account on our own Google Suite environment. From now you will also be reachable on %(email)s. To see the e-mails that you receive on this account, you can log in to google with that e-mail address. You will then be redirected to the Inter-Actief website to complete the login." +msgstr "Met dit account krijg je ook een e-mailadres en een Google Account op onze eigen Google Suite-omgeving. Van nu af aan ben je ook te bereiken op %(email)s. Om de e-mails te zien die je op dit account krijgt, kan je bij google inloggen met dat e-mailadres. Je wordt dan doorgestuurd naar de Inter-Actiefwebsite om de login te voltooien." #: amelie/claudia/templates/claudia/account_created.mail:13 -msgid "" -"All e-mails to committees that you are a member off will be sent to that e-" -"mail address, so please keep an eye on it!" -msgstr "" -"Alle e-mails naar commissies waar jij in zit worden gestuurd naar dat e-" -"mailadres, dus zorg dat je deze in de gaten houdt!" +msgid "All e-mails to committees that you are a member off will be sent to that e-mail address, so please keep an eye on it!" +msgstr "Alle e-mails naar commissies waar jij in zit worden gestuurd naar dat e-mailadres, dus zorg dat je deze in de gaten houdt!" #: amelie/claudia/templates/claudia/account_created.mail:15 #, python-format -msgid "" -"Next to e-mails to your committees, you will also receive the e-mails that " -"are sent to: %(alias)s" -msgstr "" -"Naast e-mails aan je commissies, krijg je ook e-mails die gestuurd worden " -"naar: %(alias)s" +msgid "Next to e-mails to your committees, you will also receive the e-mails that are sent to: %(alias)s" +msgstr "Naast e-mails aan je commissies, krijg je ook e-mails die gestuurd worden naar: %(alias)s" #: amelie/claudia/templates/claudia/account_created.mail:17 -msgid "" -"You can also forward all of these e-mails to your private e-mail address. " -"This forward can be set up in your profile on the Inter-Actief website: " -"( https://www.inter-actief.utwente.nl/profile/ )." -msgstr "" -"Je kan deze e-mails ook laten doorsturen naar je persoonlijke e-mailadres. " -"Deze e-mailforward kan worden ingesteld op je profiel op de Inter-Acitef " -"website: ( https://www.inter-actief.utwente.nl/profile/ )." +msgid "You can also forward all of these e-mails to your private e-mail address. This forward can be set up in your profile on the Inter-Actief website: ( https://www.inter-actief.utwente.nl/profile/ )." +msgstr "Je kan deze e-mails ook laten doorsturen naar je persoonlijke e-mailadres. Deze e-mailforward kan worden ingesteld op je profiel op de Inter-Acitef website: ( https://www.inter-actief.utwente.nl/profile/ )." #: amelie/claudia/templates/claudia/account_created.mail:19 msgid "Username:" @@ -3779,31 +2667,17 @@ msgstr "Wachtwoord:" #: amelie/claudia/templates/claudia/account_created.mail:22 msgid "" -"Before you can use all of these facilities, you need to activate your " -"account using the following page:\n" +"Before you can use all of these facilities, you need to activate your account using the following page:\n" "https://www.inter-actief.utwente.nl/account/activate/\n" -"After you have done that, you can use your account to log in to the ICT " -"systems of Inter-Actief and use all services like for example SFTP and the " -"Google Suite." +"After you have done that, you can use your account to log in to the ICT systems of Inter-Actief and use all services like for example SFTP and the Google Suite." msgstr "" -"Voordat je gebruik kunt maken van alle faciliteiten, moet je eerst via de " -"volgende pagina je account activeren:\n" +"Voordat je gebruik kunt maken van alle faciliteiten, moet je eerst via de volgende pagina je account activeren:\n" "https://www.inter-actief.utwente.nl/account/activate/\n" -"Zodra je dit gedaan hebt kun je je account gebruiken om in te loggen op de " -"ICT systemen van Inter-Actief en gebruik te maken van alle diensten zoals " -"bijvoorbeeld SFTP en de Google Suite." +"Zodra je dit gedaan hebt kun je je account gebruiken om in te loggen op de ICT systemen van Inter-Actief en gebruik te maken van alle diensten zoals bijvoorbeeld SFTP en de Google Suite." #: amelie/claudia/templates/claudia/account_created.mail:26 -msgid "" -"Do you have any questions? On https://wiki.ia.utwente.nl/ under the heading " -"ICT, you can find a list of Frequently Asked Questions, a manual on how to " -"access the committee drives and more. For other questions you can of course " -"always send us an e-mail." -msgstr "" -"Heb je nog vragen? Op https://wiki.ia.utwente.nl/ vind je onder het kopje " -"ICT een lijst van veelgestelde vragen, een handleiding over hoe je bij de " -"commissieschijven kan komen en nog veel meer. Voor andere vragen kan je ons " -"natuurlijk altijd een mailtje sturen." +msgid "Do you have any questions? On https://wiki.ia.utwente.nl/ under the heading ICT, you can find a list of Frequently Asked Questions, a manual on how to access the committee drives and more. For other questions you can of course always send us an e-mail." +msgstr "Heb je nog vragen? Op https://wiki.ia.utwente.nl/ vind je onder het kopje ICT een lijst van veelgestelde vragen, een handleiding over hoe je bij de commissieschijven kan komen en nog veel meer. Voor andere vragen kan je ons natuurlijk altijd een mailtje sturen." #: amelie/claudia/templates/claudia/account_deleted.mail:3 msgid "Active member account at Inter-Actief" @@ -3816,65 +2690,23 @@ msgstr "Beste %(name)s," #: amelie/claudia/templates/claudia/account_deleted.mail:7 msgid "" -"According to the administration of Inter-Actief, you are no longer committee " -"member and therefore should not have access to an active members account. " -"This is the account with which you could log in to the computers and the " -"Google Suite of Inter-Actief, your association membership will of course " -"continue as normal.\n" -"\n" -"The active member account will be removed automatically in 30 days " -"(including all data that you still have stored in your personal folders, and " -"all e-mails you have in your Inter-Actief Google account!). Until then, you " -"can still use your account and the folders to retrieve any important data." +"According to the administration of Inter-Actief, you are no longer committee member and therefore should not have access to an active members account. This is the account with which you could log in to the computers and the Google Suite of Inter-Actief, your association membership will of course continue as normal.\n" +"\n" +"The active member account will be removed automatically in 30 days (including all data that you still have stored in your personal folders, and all e-mails you have in your Inter-Actief Google account!). Until then, you can still use your account and the folders to retrieve any important data." msgstr "" -"Volgens de administratie van Inter-Actief ben je niet geen commissielid meer " -"en heb je dus vanaf heden geen recht meer op een actieveledenaccount. Dat is " -"het account waarmee je kon inloggen op de computers en de Google Suite van " -"Inter-Actief, je lidmaatschap blijft natuurlijk nog gewoon lopen.\n" +"Volgens de administratie van Inter-Actief ben je niet geen commissielid meer en heb je dus vanaf heden geen recht meer op een actieveledenaccount. Dat is het account waarmee je kon inloggen op de computers en de Google Suite van Inter-Actief, je lidmaatschap blijft natuurlijk nog gewoon lopen.\n" "\n" -"Het actieveledenaccount wordt over 30 dagen automatisch verwijderd " -"(inclusief alle data die jij nog had staan in je persoonlijke mappen, en " -"alle e-mails die je in je Inter-Actief Google-account hebt staan!). Tot die " -"tijd kan je nog gebruik maken van je account en de mappen om eventuele " -"nodige gegevens eraf te halen." +"Het actieveledenaccount wordt over 30 dagen automatisch verwijderd (inclusief alle data die jij nog had staan in je persoonlijke mappen, en alle e-mails die je in je Inter-Actief Google-account hebt staan!). Tot die tijd kan je nog gebruik maken van je account en de mappen om eventuele nodige gegevens eraf te halen." #: amelie/claudia/templates/claudia/account_deleted.mail:11 -msgid "" -"If you would like to join a committee again in the future, contact the board!" -msgstr "" -"Als je in de toekomst weer bij een commissie wilt aansluiten, neem contact " -"op met het bestuur!" - -#: amelie/claudia/templates/claudia/add_mapping_to_list.html:4 -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:4 -#: amelie/claudia/templates/claudia/add_to_mapping_list.html:4 -#: amelie/claudia/templates/claudia/aliasgroup_form.html:4 -#: amelie/claudia/templates/claudia/aliasgroup_list.html:4 -#: amelie/claudia/templates/claudia/confirm_add.html:4 -#: amelie/claudia/templates/claudia/confirm_delete.html:4 -#: amelie/claudia/templates/claudia/contact_form.html:4 -#: amelie/claudia/templates/claudia/contact_list.html:4 -#: amelie/claudia/templates/claudia/email_detail.html:4 -#: amelie/claudia/templates/claudia/extragroup_form.html:4 -#: amelie/claudia/templates/claudia/extragroup_list.html:4 -#: amelie/claudia/templates/claudia/extraperson_form.html:4 -#: amelie/claudia/templates/claudia/extraperson_list.html:4 -#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:4 -#: amelie/claudia/templates/claudia/extrapersonalalias_list.html:4 -#: amelie/claudia/templates/claudia/home.html:4 -#: amelie/claudia/templates/claudia/mapping_detail.html:4 -#: amelie/claudia/templates/claudia/mapping_list.html:4 -#: amelie/claudia/templates/claudia/mapping_no_mapping.html:4 -#: amelie/claudia/templates/claudia/mapping_timeline.html:4 -#: amelie/claudia/templates/claudia/nav.html:7 -#: amelie/claudia/templates/claudia/shareddrive_form.html:4 -#: amelie/claudia/templates/claudia/shareddrive_list.html:4 -#: amelie/claudia/templates/claudia/timeline_list.html:4 +msgid "If you would like to join a committee again in the future, contact the board!" +msgstr "Als je in de toekomst weer bij een commissie wilt aansluiten, neem contact op met het bestuur!" + +#: amelie/claudia/templates/claudia/add_mapping_to_list.html:4 amelie/claudia/templates/claudia/add_to_mapping_confirm.html:4 amelie/claudia/templates/claudia/add_to_mapping_list.html:4 amelie/claudia/templates/claudia/aliasgroup_form.html:4 amelie/claudia/templates/claudia/aliasgroup_list.html:4 amelie/claudia/templates/claudia/confirm_add.html:4 amelie/claudia/templates/claudia/confirm_delete.html:4 amelie/claudia/templates/claudia/contact_form.html:4 amelie/claudia/templates/claudia/contact_list.html:4 amelie/claudia/templates/claudia/email_detail.html:4 amelie/claudia/templates/claudia/extragroup_form.html:4 amelie/claudia/templates/claudia/extragroup_list.html:4 amelie/claudia/templates/claudia/extraperson_form.html:4 amelie/claudia/templates/claudia/extraperson_list.html:4 amelie/claudia/templates/claudia/extrapersonalalias_form.html:4 amelie/claudia/templates/claudia/extrapersonalalias_list.html:4 amelie/claudia/templates/claudia/home.html:4 amelie/claudia/templates/claudia/mapping_detail.html:4 amelie/claudia/templates/claudia/mapping_list.html:4 amelie/claudia/templates/claudia/mapping_no_mapping.html:4 amelie/claudia/templates/claudia/mapping_timeline.html:4 amelie/claudia/templates/claudia/nav.html:7 amelie/claudia/templates/claudia/shareddrive_form.html:4 amelie/claudia/templates/claudia/shareddrive_list.html:4 amelie/claudia/templates/claudia/timeline_list.html:4 msgid "Claudia" msgstr "Claudia" -#: amelie/claudia/templates/claudia/add_mapping_to_list.html:4 -#: amelie/claudia/templates/claudia/add_mapping_to_list.html:10 +#: amelie/claudia/templates/claudia/add_mapping_to_list.html:4 amelie/claudia/templates/claudia/add_mapping_to_list.html:10 msgid "add to" msgstr "toevoegen aan" @@ -3883,13 +2715,11 @@ msgstr "toevoegen aan" msgid "Add %(mp)s to:" msgstr "%(mp)s toevoegen aan:" -#: amelie/claudia/templates/claudia/add_mapping_to_list.html:20 -#: amelie/claudia/templates/claudia/add_to_mapping_list.html:20 +#: amelie/claudia/templates/claudia/add_mapping_to_list.html:20 amelie/claudia/templates/claudia/add_to_mapping_list.html:20 msgid "There are no results." msgstr "Er zijn geen resultaten gevonden." -#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:13 -#: amelie/claudia/templates/claudia/confirm_add.html:13 +#: amelie/claudia/templates/claudia/add_to_mapping_confirm.html:13 amelie/claudia/templates/claudia/confirm_add.html:13 #, python-format msgid "" "\n" @@ -3900,8 +2730,7 @@ msgstr "" " Wil je %(member)s toevoegen aan %(group)s?\n" " " -#: amelie/claudia/templates/claudia/add_to_mapping_list.html:4 -#: amelie/claudia/templates/claudia/add_to_mapping_list.html:10 +#: amelie/claudia/templates/claudia/add_to_mapping_list.html:4 amelie/claudia/templates/claudia/add_to_mapping_list.html:10 msgid "Add to" msgstr "Toevoegen aan" @@ -3910,13 +2739,11 @@ msgstr "Toevoegen aan" msgid "Add to %(mp)s:" msgstr "Toevoegen aan %(mp)s:" -#: amelie/claudia/templates/claudia/aliasgroup_form.html:4 -#: amelie/claudia/templates/claudia/aliasgroup_form.html:10 +#: amelie/claudia/templates/claudia/aliasgroup_form.html:4 amelie/claudia/templates/claudia/aliasgroup_form.html:10 msgid "Create new alias group" msgstr "Nieuwe aliasgroep aanmaken" -#: amelie/claudia/templates/claudia/aliasgroup_form.html:14 -#: amelie/claudia/templates/claudia/contact_form.html:14 +#: amelie/claudia/templates/claudia/aliasgroup_form.html:14 amelie/claudia/templates/claudia/contact_form.html:14 msgid "Claudia-mapping:" msgstr "Claudia-mapping:" @@ -3924,42 +2751,11 @@ msgstr "Claudia-mapping:" msgid "Create alias group" msgstr "Aliasgroep aanmaken" -#: amelie/claudia/templates/claudia/aliasgroup_list.html:22 -#: amelie/claudia/templates/claudia/contact_list.html:21 -#: amelie/claudia/templates/claudia/extragroup_list.html:22 -#: amelie/claudia/templates/claudia/extraperson_list.html:21 -#: amelie/claudia/templates/claudia/extrapersonalalias_list.html:29 -#: amelie/claudia/templates/claudia/mapping_detail.html:26 -#: amelie/members/models.py:318 amelie/members/models.py:909 -#: amelie/members/models.py:1102 amelie/members/query_forms.py:36 -#: amelie/members/templates/includes/committee_data.html:31 -#: amelie/members/templates/includes/person_data_table.html:84 -#: amelie/members/templates/includes/registration/data_overview_employee.html:14 -#: amelie/members/templates/includes/registration/data_overview_external.html:14 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:14 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:51 -#: amelie/members/templates/includes/registration/data_overview_general.html:14 -#: amelie/members/templates/includes/registration/personal_details.html:68 -#: amelie/members/templates/includes/registration/personal_details_employee.html:68 -#: amelie/members/templates/members/datablock_html.mail:21 -#: amelie/members/templates/members/datablock_plain.mail:20 -#: amelie/tools/pdf.py:118 +#: amelie/claudia/templates/claudia/aliasgroup_list.html:22 amelie/claudia/templates/claudia/contact_list.html:21 amelie/claudia/templates/claudia/extragroup_list.html:22 amelie/claudia/templates/claudia/extraperson_list.html:21 amelie/claudia/templates/claudia/extrapersonalalias_list.html:29 amelie/claudia/templates/claudia/mapping_detail.html:26 amelie/members/models.py:318 amelie/members/models.py:909 amelie/members/models.py:1102 amelie/members/query_forms.py:36 amelie/members/templates/includes/committee_data.html:31 amelie/members/templates/includes/person_data_table.html:84 amelie/members/templates/includes/registration/data_overview_employee.html:14 amelie/members/templates/includes/registration/data_overview_external.html:14 amelie/members/templates/includes/registration/data_overview_freshmen.html:14 amelie/members/templates/includes/registration/data_overview_freshmen.html:51 amelie/members/templates/includes/registration/data_overview_general.html:14 amelie/members/templates/includes/registration/personal_details.html:68 amelie/members/templates/includes/registration/personal_details_employee.html:68 amelie/members/templates/members/datablock_html.mail:21 amelie/members/templates/members/datablock_plain.mail:20 amelie/tools/pdf.py:118 msgid "E-mail address" msgstr "E-mailadres" -#: amelie/claudia/templates/claudia/aliasgroup_list.html:24 -#: amelie/claudia/templates/claudia/contact_list.html:23 -#: amelie/claudia/templates/claudia/email_detail.html:19 -#: amelie/claudia/templates/claudia/extragroup_list.html:25 -#: amelie/claudia/templates/claudia/extraperson_list.html:24 -#: amelie/claudia/templates/claudia/mapping_detail.html:22 -#: amelie/claudia/templates/claudia/mapping_list.html:52 -#: amelie/companies/templates/companies/company_banners.html:28 -#: amelie/companies/templates/companies/company_banners.html:64 -#: amelie/companies/templates/companies/company_banners.html:100 -#: amelie/companies/templates/companies/company_form.html:50 -#: amelie/members/models.py:94 amelie/members/models.py:666 -#: amelie/personal_tab/forms.py:110 +#: amelie/claudia/templates/claudia/aliasgroup_list.html:24 amelie/claudia/templates/claudia/contact_list.html:23 amelie/claudia/templates/claudia/email_detail.html:19 amelie/claudia/templates/claudia/extragroup_list.html:25 amelie/claudia/templates/claudia/extraperson_list.html:24 amelie/claudia/templates/claudia/mapping_detail.html:22 amelie/claudia/templates/claudia/mapping_list.html:52 amelie/companies/templates/companies/company_banners.html:28 amelie/companies/templates/companies/company_banners.html:64 amelie/companies/templates/companies/company_banners.html:100 amelie/companies/templates/companies/company_form.html:50 amelie/members/models.py:94 amelie/members/models.py:666 amelie/personal_tab/forms.py:110 msgid "Active" msgstr "Actief" @@ -3978,13 +2774,11 @@ msgstr "" " Wil je %(member)s verwijderen uit %(group)s?\n" " " -#: amelie/claudia/templates/claudia/contact_form.html:4 -#: amelie/claudia/templates/claudia/contact_form.html:10 +#: amelie/claudia/templates/claudia/contact_form.html:4 amelie/claudia/templates/claudia/contact_form.html:10 msgid "Create new contact" msgstr "Nieuw contact toevoegen" -#: amelie/claudia/templates/claudia/contact_list.html:4 -#: amelie/claudia/templates/claudia/contact_list.html:10 +#: amelie/claudia/templates/claudia/contact_list.html:4 amelie/claudia/templates/claudia/contact_list.html:10 msgid "Contacts" msgstr "Contacten" @@ -4009,18 +2803,11 @@ msgstr "Emaildetails:" msgid "The e-mail address %(email)s is used by the following mappings:" msgstr "Het e-mailadres %(email)s wordt gebruikt door de volgende mappings:" -#: amelie/claudia/templates/claudia/email_detail.html:15 -#: amelie/claudia/templates/claudia/mapping_list.html:50 -#: amelie/claudia/templates/claudia/mapping_timeline.html:20 -#: amelie/claudia/templates/claudia/timeline_list.html:19 -#: amelie/members/forms.py:229 amelie/members/models.py:60 -#: amelie/members/models.py:85 amelie/members/models.py:821 -#: amelie/personal_tab/forms.py:116 +#: amelie/claudia/templates/claudia/email_detail.html:15 amelie/claudia/templates/claudia/mapping_list.html:50 amelie/claudia/templates/claudia/mapping_timeline.html:20 amelie/claudia/templates/claudia/timeline_list.html:19 amelie/members/forms.py:229 amelie/members/models.py:60 amelie/members/models.py:85 amelie/members/models.py:821 amelie/personal_tab/forms.py:116 msgid "Type" msgstr "Type" -#: amelie/claudia/templates/claudia/email_detail.html:17 -#: amelie/claudia/templates/claudia/extraperson_list.html:22 +#: amelie/claudia/templates/claudia/email_detail.html:17 amelie/claudia/templates/claudia/extraperson_list.html:22 msgid "AD name" msgstr "AD-naam" @@ -4028,22 +2815,15 @@ msgstr "AD-naam" msgid "This e-mail address is not used by any mappings" msgstr "Dit e-mailadres wordt door geen enkele mapping gebruikt" -#: amelie/claudia/templates/claudia/extragroup_form.html:4 -#: amelie/claudia/templates/claudia/extragroup_form.html:10 +#: amelie/claudia/templates/claudia/extragroup_form.html:4 amelie/claudia/templates/claudia/extragroup_form.html:10 msgid "Create new extra AD group" msgstr "Nieuwe extra AD groep aanmaken" -#: amelie/claudia/templates/claudia/extragroup_form.html:14 -#: amelie/claudia/templates/claudia/extraperson_form.html:14 -#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:14 -#: amelie/claudia/templates/claudia/shareddrive_form.html:14 +#: amelie/claudia/templates/claudia/extragroup_form.html:14 amelie/claudia/templates/claudia/extraperson_form.html:14 amelie/claudia/templates/claudia/extrapersonalalias_form.html:14 amelie/claudia/templates/claudia/shareddrive_form.html:14 msgid "Claudia mapping:" msgstr "Claudia-mapping:" -#: amelie/claudia/templates/claudia/extragroup_list.html:4 -#: amelie/claudia/templates/claudia/extragroup_list.html:10 -#: amelie/claudia/templates/claudia/home.html:22 -#: amelie/claudia/templates/claudia/nav.html:13 +#: amelie/claudia/templates/claudia/extragroup_list.html:4 amelie/claudia/templates/claudia/extragroup_list.html:10 amelie/claudia/templates/claudia/home.html:22 amelie/claudia/templates/claudia/nav.html:13 msgid "Extra AD groups" msgstr "Extra AD groepen" @@ -4051,29 +2831,19 @@ msgstr "Extra AD groepen" msgid "Create extra group" msgstr "Extra groep aanmaken" -#: amelie/claudia/templates/claudia/extragroup_list.html:26 -#: amelie/members/models.py:141 amelie/members/models.py:742 -#: amelie/members/models.py:1134 -#: amelie/members/templates/includes/query/query_dogroup.html:4 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:77 -#: amelie/members/templates/includes/registration/study_freshmen.html:48 -#: amelie/members/templates/person_edit_study.html:16 -#: amelie/members/templates/registration_check.html:48 +#: amelie/claudia/templates/claudia/extragroup_list.html:26 amelie/members/models.py:141 amelie/members/models.py:742 amelie/members/models.py:1134 amelie/members/templates/includes/query/query_dogroup.html:4 amelie/members/templates/includes/registration/data_overview_freshmen.html:77 amelie/members/templates/includes/registration/study_freshmen.html:48 amelie/members/templates/person_edit_study.html:16 amelie/members/templates/registration_check.html:48 msgid "Dogroup" msgstr "Doegroep" -#: amelie/claudia/templates/claudia/extraperson_form.html:4 -#: amelie/claudia/templates/claudia/extraperson_form.html:10 +#: amelie/claudia/templates/claudia/extraperson_form.html:4 amelie/claudia/templates/claudia/extraperson_form.html:10 msgid "Create new extra AD person" msgstr "Nieuw extra AD persoon aanmaken" -#: amelie/claudia/templates/claudia/extraperson_list.html:4 -#: amelie/claudia/templates/claudia/home.html:25 +#: amelie/claudia/templates/claudia/extraperson_list.html:4 amelie/claudia/templates/claudia/home.html:25 msgid "Extra AD people" msgstr "Extra AD personen" -#: amelie/claudia/templates/claudia/extraperson_list.html:10 -#: amelie/claudia/templates/claudia/nav.html:16 +#: amelie/claudia/templates/claudia/extraperson_list.html:10 amelie/claudia/templates/claudia/nav.html:16 msgid "Extra AD users" msgstr "Extra AD gebruikers" @@ -4081,8 +2851,7 @@ msgstr "Extra AD gebruikers" msgid "Create extra AD user" msgstr "Extra AD persoon aanmaken" -#: amelie/claudia/templates/claudia/extrapersonalalias_delete.html:5 -#: amelie/claudia/templates/claudia/extrapersonalalias_delete.html:10 +#: amelie/claudia/templates/claudia/extrapersonalalias_delete.html:5 amelie/claudia/templates/claudia/extrapersonalalias_delete.html:10 msgid "Remove alias" msgstr "Alias verwijderen" @@ -4090,15 +2859,13 @@ msgstr "Alias verwijderen" #, python-format msgid "" "\n" -" Are you sure you want to remove the alias " -"%(object)s?\n" +" Are you sure you want to remove the alias %(object)s?\n" " " msgstr "" "\n" "Weet je zeker dat je alias %(object)s wilt verwijderen?" -#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:4 -#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:10 +#: amelie/claudia/templates/claudia/extrapersonalalias_form.html:4 amelie/claudia/templates/claudia/extrapersonalalias_form.html:10 msgid "Create new personal alias" msgstr "Nieuwe persoonlijke alias aanmaken" @@ -4118,10 +2885,7 @@ msgstr "Alle Extra Aliassen" msgid "Add extra personal alias" msgstr "Persoonlijke alias toevoegen" -#: amelie/claudia/templates/claudia/extrapersonalalias_list.html:27 -#: amelie/claudia/templates/claudia/mapping_detail.html:14 -#: amelie/claudia/templates/claudia/mapping_list.html:49 -#: amelie/claudia/templates/claudia/timeline_list.html:18 +#: amelie/claudia/templates/claudia/extrapersonalalias_list.html:27 amelie/claudia/templates/claudia/mapping_detail.html:14 amelie/claudia/templates/claudia/mapping_list.html:49 amelie/claudia/templates/claudia/timeline_list.html:18 msgid "Mapping" msgstr "Mapping" @@ -4135,23 +2899,12 @@ msgstr "Claudia accountbeheer" #: amelie/claudia/templates/claudia/home.html:14 msgid "" -"Hi board member! In here, you can break a lot of stuff if you don't know " -"what you're doing. Therefore,\n" -" please read this wiki page before editing\n" -" anything! Any questions? Don't hesitate to ask the SysCom or " -"WWW-Supers!" -msgstr "" -"Hoi bestuurder! Hier kun je echt vet veel slopen als je geen idee hebt wat " -"je hier doet. Lees daarom even door deze wiki pagina voordat je iets aanpast " -"hier! Vragen? Stel ze alsjeblieft! Je kunt terecht bij Beheer en de WWW-" -"Supers." - -#: amelie/claudia/templates/claudia/home.html:19 -#: amelie/claudia/templates/claudia/mapping_list.html:4 -#: amelie/claudia/templates/claudia/mapping_list.html:42 -#: amelie/claudia/templates/claudia/nav.html:10 +"Hi board member! In here, you can break a lot of stuff if you don't know what you're doing. Therefore,\n" +" please read this wiki page before editing\n" +" anything! Any questions? Don't hesitate to ask the SysCom or WWW-Supers!" +msgstr "Hoi bestuurder! Hier kun je echt vet veel slopen als je geen idee hebt wat je hier doet. Lees daarom even door deze wiki pagina voordat je iets aanpast hier! Vragen? Stel ze alsjeblieft! Je kunt terecht bij Beheer en de WWW-Supers." + +#: amelie/claudia/templates/claudia/home.html:19 amelie/claudia/templates/claudia/mapping_list.html:4 amelie/claudia/templates/claudia/mapping_list.html:42 amelie/claudia/templates/claudia/nav.html:10 msgid "Mappings" msgstr "Mappings" @@ -4163,8 +2916,7 @@ msgstr "Google Shared Drives" msgid "Google mail aliases" msgstr "Google mailaliassen" -#: amelie/claudia/templates/claudia/home.html:34 -#: amelie/claudia/templates/claudia/nav.html:25 +#: amelie/claudia/templates/claudia/home.html:34 amelie/claudia/templates/claudia/nav.html:25 msgid "External contacts" msgstr "Externe contacten" @@ -4192,60 +2944,31 @@ msgstr "Claudia-ID" msgid "Verify" msgstr "Verify" -#: amelie/claudia/templates/claudia/mapping_detail.html:70 -#: amelie/claudia/templates/claudia/mapping_timeline.html:10 -#: amelie/claudia/templates/claudia/nav.html:31 -#: amelie/claudia/templates/claudia/timeline_list.html:4 -#: amelie/claudia/templates/claudia/timeline_list.html:10 +#: amelie/claudia/templates/claudia/mapping_detail.html:70 amelie/claudia/templates/claudia/mapping_timeline.html:10 amelie/claudia/templates/claudia/nav.html:31 amelie/claudia/templates/claudia/timeline_list.html:4 amelie/claudia/templates/claudia/timeline_list.html:10 msgid "Timeline" msgstr "Timeline" -#: amelie/claudia/templates/claudia/mapping_detail.html:78 -#: amelie/members/templates/committee.html:32 -#: amelie/members/templates/statistics/overview.html:73 -#: templates/frontpage.html:110 +#: amelie/claudia/templates/claudia/mapping_detail.html:78 amelie/members/templates/committee.html:32 amelie/members/templates/statistics/overview.html:73 templates/frontpage.html:110 msgid "Members" msgstr "Leden" -#: amelie/claudia/templates/claudia/mapping_detail.html:85 -#: amelie/claudia/templates/claudia/mapping_detail.html:140 -#: amelie/members/models.py:319 amelie/members/models.py:1103 -#: amelie/members/templates/includes/person_data_table.html:58 -#: amelie/members/templates/includes/registration/contact_member.html:11 -#: amelie/members/templates/includes/registration/data_overview_employee.html:25 -#: amelie/members/templates/includes/registration/data_overview_external.html:28 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:28 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:54 -#: amelie/members/templates/includes/registration/data_overview_general.html:28 -#: amelie/members/templates/members/datablock_html.mail:15 -#: amelie/members/templates/members/datablock_plain.mail:14 -#: amelie/tools/pdf.py:110 amelie/tools/pdf.py:396 -#: templates/profile_edit.html:36 +#: amelie/claudia/templates/claudia/mapping_detail.html:85 amelie/claudia/templates/claudia/mapping_detail.html:140 amelie/members/models.py:319 amelie/members/models.py:1103 amelie/members/templates/includes/person_data_table.html:58 amelie/members/templates/includes/registration/contact_member.html:11 amelie/members/templates/includes/registration/data_overview_employee.html:25 amelie/members/templates/includes/registration/data_overview_external.html:28 amelie/members/templates/includes/registration/data_overview_freshmen.html:28 amelie/members/templates/includes/registration/data_overview_freshmen.html:54 amelie/members/templates/includes/registration/data_overview_general.html:28 amelie/members/templates/members/datablock_html.mail:15 amelie/members/templates/members/datablock_plain.mail:14 amelie/tools/pdf.py:110 amelie/tools/pdf.py:396 templates/profile_edit.html:36 msgid "Address" msgstr "Adres" -#: amelie/claudia/templates/claudia/mapping_detail.html:87 -#: amelie/claudia/templates/claudia/mapping_detail.html:142 +#: amelie/claudia/templates/claudia/mapping_detail.html:87 amelie/claudia/templates/claudia/mapping_detail.html:142 msgid "AD" msgstr "AD" -#: amelie/claudia/templates/claudia/mapping_detail.html:88 -#: amelie/claudia/templates/claudia/mapping_detail.html:143 +#: amelie/claudia/templates/claudia/mapping_detail.html:88 amelie/claudia/templates/claudia/mapping_detail.html:143 msgid "Email" msgstr "Mail" -#: amelie/claudia/templates/claudia/mapping_detail.html:95 -#: amelie/claudia/templates/claudia/mapping_detail.html:150 +#: amelie/claudia/templates/claudia/mapping_detail.html:95 amelie/claudia/templates/claudia/mapping_detail.html:150 msgid "automatic" msgstr "automatisch" -#: amelie/claudia/templates/claudia/mapping_detail.html:96 -#: amelie/claudia/templates/claudia/mapping_detail.html:97 -#: amelie/claudia/templates/claudia/mapping_detail.html:117 -#: amelie/claudia/templates/claudia/mapping_detail.html:151 -#: amelie/claudia/templates/claudia/mapping_detail.html:152 -#: amelie/claudia/templates/claudia/mapping_detail.html:172 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:78 +#: amelie/claudia/templates/claudia/mapping_detail.html:96 amelie/claudia/templates/claudia/mapping_detail.html:97 amelie/claudia/templates/claudia/mapping_detail.html:117 amelie/claudia/templates/claudia/mapping_detail.html:151 amelie/claudia/templates/claudia/mapping_detail.html:152 amelie/claudia/templates/claudia/mapping_detail.html:172 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:78 msgid "yes" msgstr "ja" @@ -4261,14 +2984,11 @@ msgstr "Lid van" msgid "Add to:" msgstr "Toevoegen aan:" -#: amelie/claudia/templates/claudia/mapping_list.html:51 -#: amelie/videos/templates/videos/ia_video_form.html:50 -#: amelie/videos/templates/videos/yt_video_form.html:50 +#: amelie/claudia/templates/claudia/mapping_list.html:51 amelie/videos/templates/videos/ia_video_form.html:50 amelie/videos/templates/videos/yt_video_form.html:50 msgid "ID" msgstr "ID" -#: amelie/claudia/templates/claudia/mapping_list.html:53 -#: amelie/education/forms.py:90 +#: amelie/claudia/templates/claudia/mapping_list.html:53 amelie/education/forms.py:90 msgid "E-mail" msgstr "E-mail" @@ -4288,14 +3008,11 @@ msgstr "Nieuw mapping aanmaken" msgid "Mapping:" msgstr "Mapping:" -#: amelie/claudia/templates/claudia/mapping_timeline.html:19 -#: amelie/claudia/templates/claudia/timeline_list.html:17 -#: amelie/personal_tab/templates/lists/activity_transactions.html:8 +#: amelie/claudia/templates/claudia/mapping_timeline.html:19 amelie/claudia/templates/claudia/timeline_list.html:17 amelie/personal_tab/templates/lists/activity_transactions.html:8 msgid "Date/time" msgstr "Datum/tijd" -#: amelie/claudia/templates/claudia/nav.html:19 -#: amelie/claudia/templates/claudia/shareddrive_list.html:4 +#: amelie/claudia/templates/claudia/nav.html:19 amelie/claudia/templates/claudia/shareddrive_list.html:4 msgid "Shared Drives" msgstr "Gedeelde Drive" @@ -4323,8 +3040,7 @@ msgstr "Google Shared Drives" msgid "Create Google shared drive" msgstr "Google shared drive aanmaken" -#: amelie/companies/forms.py:15 -#: amelie/companies/templates/companies/company_form.html:61 +#: amelie/companies/forms.py:15 amelie/companies/templates/companies/company_form.html:61 msgid "Logo" msgstr "Logo" @@ -4346,12 +3062,8 @@ msgstr "Deze tekst kan in 120 karakters worden opgemaakt" #: amelie/companies/forms.py:58 #, python-format -msgid "" -"The thumbnail logo's size is %(w)dpx by %(h)dpx, while the maximum allowed " -"size is %(min_w)dpx by %(min_h)dpx." -msgstr "" -"Het tumbnail logo heeft formaat van %(w)dpx bij %(h)dpx, waar %(min_w)dpx " -"bij %(min_h)dpx maximaal toegestaan is" +msgid "The thumbnail logo's size is %(w)dpx by %(h)dpx, while the maximum allowed size is %(min_w)dpx by %(min_h)dpx." +msgstr "Het tumbnail logo heeft formaat van %(w)dpx bij %(h)dpx, waar %(min_w)dpx bij %(min_h)dpx maximaal toegestaan is" #: amelie/companies/forms.py:65 amelie/companies/models.py:170 msgid "Website banner" @@ -4370,8 +3082,7 @@ msgid "Company Corner company or name/website is obligatory." msgstr "Company Corner bedrijf of naam/website verplicht" #: amelie/companies/forms.py:133 -msgid "" -"Activity's \"visible from\" date is later than its \"visible until\" date" +msgid "Activity's \"visible from\" date is later than its \"visible until\" date" msgstr "Activiteit zichtbaarheid ‘van’ datum is later dan de ‘tot’ datum" #: amelie/companies/forms.py:139 amelie/personal_tab/forms.py:157 @@ -4410,10 +3121,7 @@ msgstr "korte omschrijving (en)" msgid "show in app" msgstr "toon in app" -#: amelie/companies/models.py:90 -#: amelie/companies/templates/companies/company_event_form.html:47 -#: amelie/companies/templates/companies/company_statistics.html:44 -#: amelie/companies/templates/companies/company_statistics.html:132 +#: amelie/companies/models.py:90 amelie/companies/templates/companies/company_event_form.html:47 amelie/companies/templates/companies/company_statistics.html:44 amelie/companies/templates/companies/company_statistics.html:132 msgid "Company" msgstr "Bedrijf" @@ -4425,15 +3133,11 @@ msgstr "Bedrijven" msgid "The slug for this name already exists!" msgstr "De slug voor deze naam bestaat al!" -#: amelie/companies/models.py:171 -#: amelie/companies/templates/companies/company_banners.html:9 -#: amelie/companies/templates/companies/company_statistics.html:66 +#: amelie/companies/models.py:171 amelie/companies/templates/companies/company_banners.html:9 amelie/companies/templates/companies/company_statistics.html:66 msgid "Website banners" msgstr "Websitebanners" -#: amelie/companies/models.py:178 -#: amelie/companies/templates/companies/company_banners.html:45 -#: amelie/companies/templates/companies/company_statistics.html:96 +#: amelie/companies/models.py:178 amelie/companies/templates/companies/company_banners.html:45 amelie/companies/templates/companies/company_statistics.html:96 msgid "Television banners" msgstr "Televisiebanners" @@ -4441,8 +3145,7 @@ msgstr "Televisiebanners" msgid "I/O Vivat banner" msgstr "I/O Vivat banner" -#: amelie/companies/models.py:192 -#: amelie/companies/templates/companies/company_banners.html:81 +#: amelie/companies/models.py:192 amelie/companies/templates/companies/company_banners.html:81 msgid "I/O Vivat banners" msgstr "I/O Vivat banners" @@ -4456,11 +3159,9 @@ msgstr "Beste extern" #: amelie/companies/templates/companies/bannercheck.mail:7 msgid "Within the next month the following company pages will expire:" -msgstr "" -"Binnen de komende maand zullen de volgende bedrijvenpagina's vervallen:" +msgstr "Binnen de komende maand zullen de volgende bedrijvenpagina's vervallen:" -#: amelie/companies/templates/companies/bannercheck.mail:10 -#: amelie/companies/templates/companies/bannercheck.mail:22 +#: amelie/companies/templates/companies/bannercheck.mail:10 amelie/companies/templates/companies/bannercheck.mail:22 #, python-format msgid "" "\n" @@ -4470,8 +3171,7 @@ msgstr "" "\n" "
  • %(name)s op %(end_date)s
  • " -#: amelie/companies/templates/companies/bannercheck.mail:15 -#: amelie/companies/templates/companies/bannercheck.mail:27 +#: amelie/companies/templates/companies/bannercheck.mail:15 amelie/companies/templates/companies/bannercheck.mail:27 #, python-format msgid "" "\n" @@ -4505,53 +3205,34 @@ msgstr "" "\n" "Klik de websitebanner om hem aan te passen." -#: amelie/companies/templates/companies/company_banners.html:17 -#: amelie/companies/templates/companies/company_banners.html:53 -#: amelie/companies/templates/companies/company_banners.html:89 -#: amelie/personal_tab/models.py:685 +#: amelie/companies/templates/companies/company_banners.html:17 amelie/companies/templates/companies/company_banners.html:53 amelie/companies/templates/companies/company_banners.html:89 amelie/personal_tab/models.py:685 msgid "New" msgstr "Nieuw" -#: amelie/companies/templates/companies/company_banners.html:27 -#: amelie/companies/templates/companies/company_banners.html:30 -#: amelie/companies/templates/companies/company_banners.html:63 -#: amelie/companies/templates/companies/company_banners.html:66 -#: amelie/companies/templates/companies/company_banners.html:99 -#: amelie/companies/templates/companies/company_banners.html:102 +#: amelie/companies/templates/companies/company_banners.html:27 amelie/companies/templates/companies/company_banners.html:30 amelie/companies/templates/companies/company_banners.html:63 amelie/companies/templates/companies/company_banners.html:66 amelie/companies/templates/companies/company_banners.html:99 amelie/companies/templates/companies/company_banners.html:102 #, python-format msgid "Expires: %(end_date)s" msgstr "Verloopt op: %(end_date)s" -#: amelie/companies/templates/companies/company_banners.html:31 -#: amelie/companies/templates/companies/company_banners.html:67 -#: amelie/companies/templates/companies/company_banners.html:103 -#: amelie/narrowcasting/templates/room.html:172 +#: amelie/companies/templates/companies/company_banners.html:31 amelie/companies/templates/companies/company_banners.html:67 amelie/companies/templates/companies/company_banners.html:103 amelie/narrowcasting/templates/room.html:172 msgid "Turned off" msgstr "Uitgeschakeld" -#: amelie/companies/templates/companies/company_banners.html:33 -#: amelie/companies/templates/companies/company_banners.html:69 -#: amelie/companies/templates/companies/company_banners.html:105 +#: amelie/companies/templates/companies/company_banners.html:33 amelie/companies/templates/companies/company_banners.html:69 amelie/companies/templates/companies/company_banners.html:105 #, python-format msgid "Active from: %(start_date)s" msgstr "Actief vanaf: %(start_date)s" -#: amelie/companies/templates/companies/company_banners.html:34 -#: amelie/companies/templates/companies/company_banners.html:70 -#: amelie/companies/templates/companies/company_banners.html:106 +#: amelie/companies/templates/companies/company_banners.html:34 amelie/companies/templates/companies/company_banners.html:70 amelie/companies/templates/companies/company_banners.html:106 msgid "Future" msgstr "Toekomst" -#: amelie/companies/templates/companies/company_banners.html:36 -#: amelie/companies/templates/companies/company_banners.html:72 -#: amelie/companies/templates/companies/company_banners.html:108 +#: amelie/companies/templates/companies/company_banners.html:36 amelie/companies/templates/companies/company_banners.html:72 amelie/companies/templates/companies/company_banners.html:108 #, python-format msgid "Has expired on: %(end_date)s" msgstr "Verlopen op: %(end_date)s" -#: amelie/companies/templates/companies/company_banners.html:37 -#: amelie/companies/templates/companies/company_banners.html:73 -#: amelie/companies/templates/companies/company_banners.html:109 +#: amelie/companies/templates/companies/company_banners.html:37 amelie/companies/templates/companies/company_banners.html:73 amelie/companies/templates/companies/company_banners.html:109 msgid "Past" msgstr "Verleden" @@ -4573,8 +3254,7 @@ msgstr "" "\n" "Klik de vivatbanner om hem aan te passen." -#: amelie/companies/templates/companies/company_banners_form.html:4 -#: amelie/companies/templates/companies/company_banners_form.html:8 +#: amelie/companies/templates/companies/company_banners_form.html:4 amelie/companies/templates/companies/company_banners_form.html:8 msgid "Edit banner" msgstr "Pas banner aan" @@ -4586,33 +3266,25 @@ msgstr "Banner opslaan" msgid "URL" msgstr "URL" -#: amelie/companies/templates/companies/company_details.html:32 -#: amelie/companies/templates/companies/company_form.html:112 +#: amelie/companies/templates/companies/company_details.html:32 amelie/companies/templates/companies/company_form.html:112 msgid "Edit company" msgstr "Wijzig bedrijf" -#: amelie/companies/templates/companies/company_event_form.html:17 -#: amelie/education/templates/education_event_form.html:21 +#: amelie/companies/templates/companies/company_event_form.html:17 amelie/education/templates/education_event_form.html:21 msgid "Edit this event " msgstr "Event wijzigen" #: amelie/companies/templates/companies/company_event_form.html:50 msgid "" "\n" -" Fill in the company which organises this event. " -"If the company has a page on the company\n" -" corner fill in the first field, otherwise fill " -"in the other two fields\n" +" Fill in the company which organises this event. If the company has a page on the company\n" +" corner fill in the first field, otherwise fill in the other two fields\n" " " msgstr "" "\n" -"Vul hier het bedrijf dat dit event organiseert in, als het bedrijf een " -"company corner pagina heeft vul dan het eerste vakje in, vul anders de " -"andere twee vakjes in" +"Vul hier het bedrijf dat dit event organiseert in, als het bedrijf een company corner pagina heeft vul dan het eerste vakje in, vul anders de andere twee vakjes in" -#: amelie/companies/templates/companies/company_event_list.html:8 -#: amelie/companies/templates/companies/company_event_list.html:17 -#: amelie/companies/templates/companies/company_event_list.html:74 +#: amelie/companies/templates/companies/company_event_list.html:8 amelie/companies/templates/companies/company_event_list.html:17 amelie/companies/templates/companies/company_event_list.html:74 msgid "External event" msgstr "Externe activiteit" @@ -4632,8 +3304,7 @@ msgstr "tot:" msgid "from:" msgstr "vanaf:" -#: amelie/companies/templates/companies/company_event_list.html:54 -#: amelie/education/templates/education_event_overview.html:46 +#: amelie/companies/templates/companies/company_event_list.html:54 amelie/education/templates/education_event_overview.html:46 msgid "There are not (as of yet) any events in the future, check again soon!" msgstr "Er zijn (nog) geen events in de toekomst, kijk binnenkort nogmaals!" @@ -4649,8 +3320,7 @@ msgstr "Eerdere externe activiteiten" msgid "iCal document with activity " msgstr "iCal-document met event" -#: amelie/companies/templates/companies/company_form.html:6 -#: amelie/companies/templates/companies/company_form.html:19 +#: amelie/companies/templates/companies/company_form.html:6 amelie/companies/templates/companies/company_form.html:19 msgid "New company" msgstr "Nieuw bedrijf" @@ -4662,8 +3332,7 @@ msgstr "wijzigen" msgid "Change company" msgstr "Bedrijf wijzigen" -#: amelie/companies/templates/companies/company_form.html:74 -#: amelie/tools/models.py:13 +#: amelie/companies/templates/companies/company_form.html:74 amelie/tools/models.py:13 msgid "Profile" msgstr "Profiel" @@ -4671,10 +3340,7 @@ msgstr "Profiel" msgid "Add company" msgstr "Bedrijf toevoegen" -#: amelie/companies/templates/companies/company_overview.html:6 -#: amelie/companies/templates/companies/company_statistics.html:38 -#: templates/basis.html:217 templates/frontpage.html:74 -#: templates/frontpage.html:79 +#: amelie/companies/templates/companies/company_overview.html:6 amelie/companies/templates/companies/company_statistics.html:38 templates/basis.html:217 templates/frontpage.html:74 templates/frontpage.html:79 msgid "Company Corner" msgstr "Company Corner" @@ -4703,12 +3369,8 @@ msgid "At this moment, no companies are available in the Company Corner." msgstr "Er zijn op dit moment geen bedrijven in de company corner beschikbaar." #: amelie/companies/templates/companies/company_overview.html:56 -msgid "" -"Would you like your company to be promoted here as well? Contact our Officer " -"of External Affairs to discuss the opportunities!" -msgstr "" -"Wilt u uw bedrijf ook hier gepromoot zien worden? Neem contact op met onze " -"Functionaris Externe Betrekkingen om de mogelijkheden te bespreken!" +msgid "Would you like your company to be promoted here as well? Contact our Officer of External Affairs to discuss the opportunities!" +msgstr "Wilt u uw bedrijf ook hier gepromoot zien worden? Neem contact op met onze Functionaris Externe Betrekkingen om de mogelijkheden te bespreken!" #: amelie/companies/templates/companies/company_overview.html:58 msgid "collaboration@inter-actief.net" @@ -4718,43 +3380,28 @@ msgstr "samenwerking@inter-actief.net" msgid "Mail collaboration@inter-actief.net" msgstr "Mail samenwerking@inter-actief.net" -#: amelie/companies/templates/companies/company_statistics.html:6 -#: amelie/companies/templates/companies/company_statistics.html:12 +#: amelie/companies/templates/companies/company_statistics.html:6 amelie/companies/templates/companies/company_statistics.html:12 msgid "Company statistics" msgstr "Bedrijfsstatistieken" -#: amelie/companies/templates/companies/company_statistics.html:15 -#: amelie/personal_tab/templates/cookie_corner_statistics_form.html:13 +#: amelie/companies/templates/companies/company_statistics.html:15 amelie/personal_tab/templates/cookie_corner_statistics_form.html:13 msgid "Select a period and click Statistics." msgstr "Selecteer een periode en klik op Statistieken." -#: amelie/companies/templates/companies/company_statistics.html:23 -#: amelie/personal_tab/templates/cookie_corner_overview.html:19 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:456 -#: amelie/personal_tab/templates/cookie_corner_statistics_form.html:21 -#: amelie/personal_tab/templates/exports/screen.html:31 -#: amelie/room_duty/templates/room_duty/table/overview.html:154 -#: amelie/statistics/templates/statistics.html:5 -#: amelie/statistics/templates/statistics.html:10 +#: amelie/companies/templates/companies/company_statistics.html:23 amelie/personal_tab/templates/cookie_corner_overview.html:19 amelie/personal_tab/templates/cookie_corner_statistics.html:456 amelie/personal_tab/templates/cookie_corner_statistics_form.html:21 amelie/personal_tab/templates/exports/screen.html:31 amelie/room_duty/templates/room_duty/table/overview.html:154 amelie/statistics/templates/statistics.html:5 amelie/statistics/templates/statistics.html:10 msgid "Statistics" msgstr "Statistieken" #: amelie/companies/templates/companies/company_statistics.html:28 msgid "" "\n" -" Please note that historic data might be " -"inaccurate. Many banners and company corner pages are re-used, with their " -"start and end date changed.\n" +" Please note that historic data might be inaccurate. Many banners and company corner pages are re-used, with their start and end date changed.\n" " " msgstr "" "\n" -"Hou er rekening mee dat historische data incorrect kan zijn. Veel banners en " -"company corner pagina's worden hergebruikt, met een nieuwe start en " -"einddatum." +"Hou er rekening mee dat historische data incorrect kan zijn. Veel banners en company corner pagina's worden hergebruikt, met een nieuwe start en einddatum." -#: amelie/companies/templates/companies/company_statistics.html:45 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:18 -#: amelie/personal_tab/templates/exports/screen.html:9 +#: amelie/companies/templates/companies/company_statistics.html:45 amelie/personal_tab/templates/cookie_corner_statistics.html:18 amelie/personal_tab/templates/exports/screen.html:9 msgid "Start date" msgstr "Begindatum:" @@ -4762,18 +3409,15 @@ msgstr "Begindatum:" msgid "End date" msgstr "Eind datum" -#: amelie/companies/templates/companies/company_statistics.html:72 -#: amelie/companies/templates/companies/company_statistics.html:102 +#: amelie/companies/templates/companies/company_statistics.html:72 amelie/companies/templates/companies/company_statistics.html:102 msgid "Name (company)" msgstr "Naam (bedrijf)" -#: amelie/companies/templates/companies/company_statistics.html:73 -#: amelie/companies/templates/companies/company_statistics.html:103 +#: amelie/companies/templates/companies/company_statistics.html:73 amelie/companies/templates/companies/company_statistics.html:103 msgid "Set start date" msgstr "Gegeven startdatum" -#: amelie/companies/templates/companies/company_statistics.html:74 -#: amelie/companies/templates/companies/company_statistics.html:104 +#: amelie/companies/templates/companies/company_statistics.html:74 amelie/companies/templates/companies/company_statistics.html:104 msgid "Set end date" msgstr "Gegeven einddatum" @@ -4806,11 +3450,8 @@ msgid "For which things do you want to request a data export?" msgstr "Voor welke dingen wil je een data-export aanvragen?" #: amelie/data_export/forms.py:13 -msgid "" -"Which applications, files or other data this data export has to contain." -msgstr "" -"Voor welke applicaties, bestanden of andere gegevens deze data-export " -"gemaakt moet worden." +msgid "Which applications, files or other data this data export has to contain." +msgstr "Voor welke applicaties, bestanden of andere gegevens deze data-export gemaakt moet worden." #: amelie/data_export/models.py:28 msgid "Download code" @@ -4824,8 +3465,7 @@ msgstr "Code waarmee deze export gedownload kan worden." msgid "The person whose data export this is." msgstr "De persoon van wie deze data-export is." -#: amelie/data_export/models.py:34 -#: amelie/data_export/templates/data_export/dataexport_download_details.html:6 +#: amelie/data_export/models.py:34 amelie/data_export/templates/data_export/dataexport_download_details.html:6 msgid "Filename" msgstr "Bestandsnaam" @@ -4849,8 +3489,7 @@ msgstr "Tijdstempel van afronding" msgid "The time that this data export was completed." msgstr "De tijd waarop de data-export compleet was." -#: amelie/data_export/models.py:43 -#: amelie/data_export/templates/data_export/dataexport_download_details.html:18 +#: amelie/data_export/models.py:43 amelie/data_export/templates/data_export/dataexport_download_details.html:18 msgid "Number of times downloaded" msgstr "Aantal keer gedownload" @@ -4903,12 +3542,8 @@ msgid "Data in the Inter-/Actief/ website and the members database." msgstr "Gegevens in de Inter-/Actief/-website en -ledendatabase." #: amelie/data_export/models.py:82 -msgid "" -"Files you have uploaded to the Inter-/Actief/ website (warning, may be very " -"large)." -msgstr "" -"Bestanden die je hebt geupload naar de Inter-/Actief/-website (waarschuwing, " -"kan heel groot zijn)." +msgid "Files you have uploaded to the Inter-/Actief/ website (warning, may be very large)." +msgstr "Bestanden die je hebt geupload naar de Inter-/Actief/-website (waarschuwing, kan heel groot zijn)." #: amelie/data_export/models.py:84 msgid "Data from Alexia, the drink management system." @@ -4919,19 +3554,14 @@ msgid "Data in GitLab, the version control system." msgstr "Gegevens in GitLab, de version control." #: amelie/data_export/models.py:86 -msgid "" -"The home directory of your Inter-Actief active members account (warning, may " -"be very large)." -msgstr "" -"De homemap van je Inter-Actief actieveledenaccount (waarschuwing, kan heel " -"groot zijn)." +msgid "The home directory of your Inter-Actief active members account (warning, may be very large)." +msgstr "De homemap van je Inter-Actief actieveledenaccount (waarschuwing, kan heel groot zijn)." #: amelie/data_export/models.py:100 msgid "Which data export this status belongs to" msgstr "Bij welke data-export deze status hoort" -#: amelie/data_export/models.py:102 -#: amelie/oauth/templates/oauth_access_request.mail:7 +#: amelie/data_export/models.py:102 amelie/oauth/templates/oauth_access_request.mail:7 msgid "Application" msgstr "Applicatie" @@ -4939,8 +3569,7 @@ msgstr "Applicatie" msgid "The name of the application you want to export data from." msgstr "De naam van de applicatie waar je data van wilt exporteren." -#: amelie/data_export/models.py:105 -#: amelie/data_export/templates/data_export/dataexport_detail.html:84 +#: amelie/data_export/models.py:105 amelie/data_export/templates/data_export/dataexport_detail.html:84 msgid "Export status" msgstr "Exporteerstatus" @@ -4960,8 +3589,7 @@ msgstr "Applicatiestatussen" msgid "Export status for {} of {} ({})" msgstr "Exportstatus voor {} van {} ({})" -#: amelie/data_export/templates/data_export/dataexport_detail.html:54 -#: amelie/data_export/templates/data_export/dataexport_detail.html:79 +#: amelie/data_export/templates/data_export/dataexport_detail.html:54 amelie/data_export/templates/data_export/dataexport_detail.html:79 msgid "Download your finished data export here." msgstr "Download hier je klaargemaakte data-export." @@ -4969,9 +3597,7 @@ msgstr "Download hier je klaargemaakte data-export." msgid "Your data export is not finished yet! Please check the status below." msgstr "Je data-export is nog niet klaar! Bekijk hieronder de status." -#: amelie/data_export/templates/data_export/dataexport_detail.html:88 -#: amelie/tools/models.py:27 -#: amelie/tools/templates/data_export_statistics.html:27 +#: amelie/data_export/templates/data_export/dataexport_detail.html:88 amelie/tools/models.py:27 amelie/tools/templates/data_export_statistics.html:27 msgid "Export type" msgstr "Exporttype" @@ -4983,8 +3609,7 @@ msgstr "Je hebt geen dingen geëxporteerd! Ben jij een tovenaar?" msgid "Download details" msgstr "Downloaddetails" -#: amelie/data_export/templates/data_export/dataexport_download_details.html:10 -#: amelie/data_export/templates/data_export/dataexport_download_details.html:36 +#: amelie/data_export/templates/data_export/dataexport_download_details.html:10 amelie/data_export/templates/data_export/dataexport_download_details.html:36 msgid "Requested on" msgstr "Aangevraagd op" @@ -5001,8 +3626,7 @@ msgstr "%(download_count)s keer" msgid "Size" msgstr "Grootte" -#: amelie/data_export/templates/data_export/dataexport_download_details.html:26 -#: amelie/data_export/templates/data_export/dataexport_download_details.html:40 +#: amelie/data_export/templates/data_export/dataexport_download_details.html:26 amelie/data_export/templates/data_export/dataexport_download_details.html:40 msgid "Expiry date" msgstr "Verloopdatum" @@ -5010,63 +3634,33 @@ msgstr "Verloopdatum" msgid "Download export" msgstr "Download export" -#: amelie/data_export/templates/data_export/dataexport_download_details.html:33 -#: amelie/tools/models.py:30 -#: amelie/tools/templates/data_export_statistics.html:30 +#: amelie/data_export/templates/data_export/dataexport_download_details.html:33 amelie/tools/models.py:30 amelie/tools/templates/data_export_statistics.html:30 msgid "Export details" msgstr "Exportdetails" -#: amelie/data_export/templates/data_export/dataexport_form.html:5 -#: amelie/data_export/templates/data_export/dataexport_form.html:21 -#: templates/profile_overview.html:23 +#: amelie/data_export/templates/data_export/dataexport_form.html:5 amelie/data_export/templates/data_export/dataexport_form.html:21 templates/profile_overview.html:23 msgid "Export personal data" msgstr "Exporteer persoonlijke gegevens" #: amelie/data_export/templates/data_export/dataexport_form.html:25 -msgid "" -"On this page you can request a data export of all of your personal data that " -"I.C.T.S.V. Inter-Actief has about you." -msgstr "" -"Op deze pagina kan je een export aanvragen van alle persoonlijke gegevens " -"die I.C.T.S.V. Inter-Actief over je heeft." +msgid "On this page you can request a data export of all of your personal data that I.C.T.S.V. Inter-Actief has about you." +msgstr "Op deze pagina kan je een export aanvragen van alle persoonlijke gegevens die I.C.T.S.V. Inter-Actief over je heeft." #: amelie/data_export/templates/data_export/dataexport_form.html:26 -msgid "" -"First choose which data you want to have included in the export (some " -"options can make the export pretty big), and then click on \"Request export" -"\". Then you will be sent to a status page on which you can check the status " -"of your export. You will also get an e-mail when the export has finished " -"with a download link." -msgstr "" -"Kies eerst welke gegevens je allemaal wilt exporteren (sommigen kunnen je " -"export namelijk vrij groot maken), en klik daarna op \"Export aanvragen\". " -"Je wordt dan naar een statuspagina gestuurd waar je de status van je export " -"kan zien, en je krijgt ook een e-mailtje als de export klaar is met een " -"downloadlink." +msgid "First choose which data you want to have included in the export (some options can make the export pretty big), and then click on \"Request export\". Then you will be sent to a status page on which you can check the status of your export. You will also get an e-mail when the export has finished with a download link." +msgstr "Kies eerst welke gegevens je allemaal wilt exporteren (sommigen kunnen je export namelijk vrij groot maken), en klik daarna op \"Export aanvragen\". Je wordt dan naar een statuspagina gestuurd waar je de status van je export kan zien, en je krijgt ook een e-mailtje als de export klaar is met een downloadlink." #: amelie/data_export/templates/data_export/dataexport_form.html:27 -msgid "" -"24 to 48 hours after the export has finished, it will be deleted from the IA-" -"servers and your download link will expire." -msgstr "" -"24 tot 48 uur nadat de export klaar is wordt hij weer verwijderd van de IA-" -"servers en vervalt je downloadlink." +msgid "24 to 48 hours after the export has finished, it will be deleted from the IA-servers and your download link will expire." +msgstr "24 tot 48 uur nadat de export klaar is wordt hij weer verwijderd van de IA-servers en vervalt je downloadlink." #: amelie/data_export/templates/data_export/dataexport_form.html:29 -msgid "" -"You are not logged in. To automatically create a data export of your data " -"you need to be logged in." -msgstr "" -"Je bent niet ingelogd. Om automatisch een data-export te kunnen maken van je " -"gegevens moet je inloggen." +msgid "You are not logged in. To automatically create a data export of your data you need to be logged in." +msgstr "Je bent niet ingelogd. Om automatisch een data-export te kunnen maken van je gegevens moet je inloggen." #: amelie/data_export/templates/data_export/dataexport_form.html:30 -msgid "" -"If you do not have an account at Inter-Actief, but want to know what data we " -"have about you, please send an e-mail to the board." -msgstr "" -"Als je geen account hebt bij Inter-Actief en toch wilt weten welke gegevens " -"we over je hebben, stuur dan een mailtje naar het bestuur." +msgid "If you do not have an account at Inter-Actief, but want to know what data we have about you, please send an e-mail to the board." +msgstr "Als je geen account hebt bij Inter-Actief en toch wilt weten welke gegevens we over je hebben, stuur dan een mailtje naar het bestuur." #: amelie/data_export/templates/data_export/dataexport_form.html:31 msgid "Go to our contact page." @@ -5079,30 +3673,19 @@ msgstr "Data-export aanvragen" #: amelie/data_export/templates/data_export/dataexport_form.html:42 msgid "" "\n" -" Unfortunately you have already created a data " -"export recently that has not expired yet.\n" -" Please download the old export using the " -"download link that you have received per e-mail.\n" -" If you do not have this link any more, you will " -"have to wait until the old export has expired, before you can create a new " -"one.\n" -" Sorry for the inconvenience, this is purely a " -"method to give our servers a little bit of rest too.\n" -" If you really want a new data export earlier, " -"then please send an e-mail to the board.\n" +" Unfortunately you have already created a data export recently that has not expired yet.\n" +" Please download the old export using the download link that you have received per e-mail.\n" +" If you do not have this link any more, you will have to wait until the old export has expired, before you can create a new one.\n" +" Sorry for the inconvenience, this is purely a method to give our servers a little bit of rest too.\n" +" If you really want a new data export earlier, then please send an e-mail to the board.\n" " " msgstr "" "\n" -"Helaas heb je recentelijk al een data-export aangevraagd die nog niet " -"verlopen is.\n" -"Download a.u.b. de oude export via de download-link die je per e-mail hebt " -"gekregen.\n" -"Als je deze link niet meer hebt, dan zul je moeten wachten totdat de oude " -"export verlopen\n" -"is voordat je weer een nieuwe export mag aanvragen. Excuses voor het " -"ongemak, dit is puur\n" -"bedoeld om onze servers ook een beetje rust te geven. Wil je toch al eerder " -"een nieuwe\n" +"Helaas heb je recentelijk al een data-export aangevraagd die nog niet verlopen is.\n" +"Download a.u.b. de oude export via de download-link die je per e-mail hebt gekregen.\n" +"Als je deze link niet meer hebt, dan zul je moeten wachten totdat de oude export verlopen\n" +"is voordat je weer een nieuwe export mag aanvragen. Excuses voor het ongemak, dit is puur\n" +"bedoeld om onze servers ook een beetje rust te geven. Wil je toch al eerder een nieuwe\n" "export maken, stuur dan een mailtje naar het bestuur." #: amelie/data_export/templates/data_export/dataexport_form.html:56 @@ -5114,44 +3697,24 @@ msgid "Inter-Actief data export completed" msgstr "Inter-Actief Data-export compleet" #: amelie/data_export/templates/data_export/mails/export_complete.mail:7 -msgid "" -"You are receiving this e-mail because you recently requested a data export " -"of the personal data that Inter-Actief has about you." -msgstr "" -"Je ontvangt deze e-mail omdat je recentelijk een data-export hebt " -"aangevraagd van de persoonlijke data die Inter-Actief over je heeft." +msgid "You are receiving this e-mail because you recently requested a data export of the personal data that Inter-Actief has about you." +msgstr "Je ontvangt deze e-mail omdat je recentelijk een data-export hebt aangevraagd van de persoonlijke data die Inter-Actief over je heeft." #: amelie/data_export/templates/data_export/mails/export_complete.mail:9 -msgid "" -"This data export is now complete and can be downloaded from our website. For " -"security reasons the download will only be available for 24 hours, after " -"which it will be deleted from our server. You can download the export from " -"the following URL:" -msgstr "" -"Deze data-export is klaar en kan nu gedownload worden van onze website. Voor " -"veiligheidsredenen is deze download maar 24 uur geldig, waarna hij " -"verwijderd zal worden van onze server. Je kan de data-export downloaden op " -"de volgende URL:" +msgid "This data export is now complete and can be downloaded from our website. For security reasons the download will only be available for 24 hours, after which it will be deleted from our server. You can download the export from the following URL:" +msgstr "Deze data-export is klaar en kan nu gedownload worden van onze website. Voor veiligheidsredenen is deze download maar 24 uur geldig, waarna hij verwijderd zal worden van onze server. Je kan de data-export downloaden op de volgende URL:" #: amelie/data_export/templates/data_export/mails/export_complete.mail:13 -msgid "" -"Did you not request this data export yourself? Please contact the board as " -"soon as possible via" -msgstr "" -"Heb je deze data-export niet zelf aangevraagd? Neem dan a.u.b. direct " -"contact op met" +msgid "Did you not request this data export yourself? Please contact the board as soon as possible via" +msgstr "Heb je deze data-export niet zelf aangevraagd? Neem dan a.u.b. direct contact op met" #: amelie/data_export/templates/data_export/mails/export_complete.mail:13 msgid "board@inter-actief.net" msgstr "bestuur@inter-actief.net" #: amelie/data_export/templates/data_export/metadata/metadata.txt:13 -msgid "" -"This data export contains all personal data that Inter-Actief has on this " -"person:" -msgstr "" -"Deze data-export bevat alle persoonsgegevens die Inter-Actief bezit van de " -"deze persoon:" +msgid "This data export contains all personal data that Inter-Actief has on this person:" +msgstr "Deze data-export bevat alle persoonsgegevens die Inter-Actief bezit van de deze persoon:" #: amelie/data_export/templates/data_export/metadata/metadata.txt:16 msgid "This export was requested on:" @@ -5174,76 +3737,46 @@ msgid "No applications/services were exported." msgstr "Er zijn geen applicaties/diensten geëxporteerd." #: amelie/data_export/templates/data_export/metadata/metadata.txt:26 -msgid "" -"This export was created by Amélie, the website and member administration of " -"I.C.T.S.V. Inter-/Actief/." -msgstr "" -"Deze export is gemaakt door Amélie, de website en ledenadministratie van I.C." -"T.S.V. Inter-/Actief/." +msgid "This export was created by Amélie, the website and member administration of I.C.T.S.V. Inter-/Actief/." +msgstr "Deze export is gemaakt door Amélie, de website en ledenadministratie van I.C.T.S.V. Inter-/Actief/." #: amelie/data_export/templates/data_export/metadata/metadata.txt:27 msgid "For comments or problems, please contact us at www@inter-actief.net." -msgstr "" -"Voor opmerkingen of problemen, neem a.u.b. contact op met www@inter-actief." -"net." +msgstr "Voor opmerkingen of problemen, neem a.u.b. contact op met www@inter-actief.net." -#: amelie/data_export/views.py:99 amelie/data_export/views.py:127 -#: amelie/data_export/views.py:130 +#: amelie/data_export/views.py:99 amelie/data_export/views.py:127 amelie/data_export/views.py:130 msgid "Could not find a data export download with this code." msgstr "Kon geen data-export download vinden met deze code." -#: amelie/education/forms.py:44 amelie/education/models.py:207 -#: amelie/education/models.py:216 +#: amelie/education/forms.py:44 amelie/education/models.py:207 amelie/education/models.py:216 msgid "Module" msgstr "Module" -#: amelie/education/forms.py:45 amelie/education/forms.py:52 -#: amelie/education/forms.py:87 amelie/education/models.py:220 -#: amelie/education/templates/complaints.html:59 -#: amelie/education/templates/complaints.html:119 amelie/members/models.py:143 -#: amelie/members/models.py:738 -#: amelie/members/templates/includes/query/query_study.html:4 -#: amelie/members/templates/members/datablock_html.mail:13 -#: amelie/members/templates/members/datablock_plain.mail:12 -#: amelie/members/templates/person_edit_study.html:12 -#: amelie/members/templates/registration_check.html:44 -#: amelie/members/templates/statistics/overview.html:16 amelie/tools/pdf.py:139 -#: amelie/tools/pdf.py:144 templates/profile_edit.html:80 +#: amelie/education/forms.py:45 amelie/education/forms.py:52 amelie/education/forms.py:87 amelie/education/models.py:220 amelie/education/templates/complaints.html:59 amelie/education/templates/complaints.html:119 amelie/members/models.py:143 amelie/members/models.py:738 amelie/members/templates/includes/query/query_study.html:4 amelie/members/templates/members/datablock_html.mail:13 amelie/members/templates/members/datablock_plain.mail:12 amelie/members/templates/person_edit_study.html:12 amelie/members/templates/registration_check.html:44 amelie/members/templates/statistics/overview.html:16 amelie/tools/pdf.py:139 amelie/tools/pdf.py:144 templates/profile_edit.html:80 msgid "Course" msgstr "Vak" -#: amelie/education/forms.py:55 amelie/education/models.py:131 -#: amelie/education/models.py:264 amelie/members/models.py:822 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:18 -#: amelie/personal_tab/templates/lists/transactions_totals.html:18 +#: amelie/education/forms.py:55 amelie/education/models.py:131 amelie/education/models.py:264 amelie/members/models.py:822 amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:18 amelie/personal_tab/templates/lists/transactions_totals.html:18 msgid "Year" msgstr "Jaar" #: amelie/education/forms.py:72 -msgid "" -"If the deadline for revision of your exam has passed, you can select a course" +msgid "If the deadline for revision of your exam has passed, you can select a course" msgstr "Als een nakijktermijn verstreken is, moet je een vak selecteren" #: amelie/education/forms.py:81 msgid "Fill in a summary and comments" msgstr "Vul een samenvatting en opmerking in." -#: amelie/education/forms.py:86 -#: amelie/education/templates/dea_nomination.html:21 -#: amelie/education/templates/dea_vote.html:17 +#: amelie/education/forms.py:86 amelie/education/templates/dea_nomination.html:21 amelie/education/templates/dea_vote.html:17 msgid "Teacher" msgstr "Docent" -#: amelie/education/forms.py:88 -#: amelie/education/templates/dea_nomination.html:25 -#: amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:23 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:149 -#: amelie/tools/templates/data_export_statistics.html:28 +#: amelie/education/forms.py:88 amelie/education/templates/dea_nomination.html:25 amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:23 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:149 amelie/tools/templates/data_export_statistics.html:28 msgid "Reason" msgstr "Reden" -#: amelie/education/forms.py:89 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:27 +#: amelie/education/forms.py:89 amelie/weekmail/templates/weekmail/weekmail_wizard.html:27 msgid "Author" msgstr "Auteur" @@ -5263,11 +3796,19 @@ msgstr "Modulenaam" msgid "Name of course" msgstr "Naam vak" -#: amelie/education/models.py:30 amelie/members/forms.py:735 -#: amelie/members/models.py:902 amelie/personal_tab/models.py:283 -#: amelie/personal_tab/models.py:341 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:58 -#: amelie/personal_tab/templates/price_list.html:14 +#: amelie/education/graphql.py:28 +msgid "Page name (localized for user)" +msgstr "Pagina naam (aangepast in de taal van de gebruiker)" + +#: amelie/education/graphql.py:29 +msgid "Page content (localized for user)" +msgstr "Pagina inhoud (aangepast aan de taal van de gebruiker)" + +#: amelie/education/graphql.py:50 +msgid "Category name (localized for user)" +msgstr "Categorie naam (aangepast aan de taal van de gebruiker)" + +#: amelie/education/models.py:30 amelie/members/forms.py:735 amelie/members/models.py:902 amelie/personal_tab/models.py:283 amelie/personal_tab/models.py:341 amelie/personal_tab/templates/cookie_corner_statistics.html:58 amelie/personal_tab/templates/price_list.html:14 msgid "Category" msgstr "Categorie" @@ -5312,28 +3853,16 @@ msgid "Parts of year" msgstr "Jaardelen" #: amelie/education/models.py:164 -msgid "" -"Start of enrollment term for the exams may not be after or simultaneous to " -"the end of this term." -msgstr "" -"Begin van tentamen inschrijven kan niet na het einde voorkomen of gelijk " -"zijn aan het einde." +msgid "Start of enrollment term for the exams may not be after or simultaneous to the end of this term." +msgstr "Begin van tentamen inschrijven kan niet na het einde voorkomen of gelijk zijn aan het einde." #: amelie/education/models.py:169 -msgid "" -"Start of enrollment term for courses may not be after or simultaneous to the " -"end of this term." -msgstr "" -"Begin van vakken inschrijven kan niet na het einde voorkomen of gelijk zijn " -"aan het einde." +msgid "Start of enrollment term for courses may not be after or simultaneous to the end of this term." +msgstr "Begin van vakken inschrijven kan niet na het einde voorkomen of gelijk zijn aan het einde." #: amelie/education/models.py:174 -msgid "" -"Start of the term for ordering books may not be after or simultaneous to the " -"end of this term." -msgstr "" -"Begin boeken bestellen kan niet na het einde voorkomen of gelijk zijn aan " -"het einde." +msgid "Start of the term for ordering books may not be after or simultaneous to the end of this term." +msgstr "Begin boeken bestellen kan niet na het einde voorkomen of gelijk zijn aan het einde." #: amelie/education/models.py:179 amelie/education/templates/course_new.html:29 msgid "Course code" @@ -5343,8 +3872,7 @@ msgstr "Vakcode" msgid "Modules" msgstr "Modules" -#: amelie/education/models.py:221 amelie/education/templates/summaries.html:22 -#: amelie/members/models.py:219 +#: amelie/education/models.py:221 amelie/education/templates/summaries.html:22 amelie/members/models.py:219 msgid "Courses" msgstr "Vakken" @@ -5364,8 +3892,7 @@ msgstr "Informatievoorziening" msgid "Internationalization" msgstr "Internationalisering" -#: amelie/education/models.py:239 -#: amelie/members/templates/statistics/overview.html:79 +#: amelie/education/models.py:239 amelie/members/templates/statistics/overview.html:79 msgid "Otherwise" msgstr "Anders" @@ -5421,16 +3948,11 @@ msgstr "Vak of Module" msgid "Term" msgstr "Periode" -#: amelie/education/models.py:269 amelie/education/models.py:286 -#: amelie/education/templates/complaint.html:4 -#: amelie/education/templates/complaint.html:9 -#: amelie/education/templates/complaint_new.html:71 -#: amelie/education/templates/complaints.html:165 +#: amelie/education/models.py:269 amelie/education/models.py:286 amelie/education/templates/complaint.html:4 amelie/education/templates/complaint.html:9 amelie/education/templates/complaint_new.html:71 amelie/education/templates/complaints.html:165 msgid "Complaint" msgstr "Klacht" -#: amelie/education/models.py:270 templates/basis.html:231 -#: templates/frontpage.html:232 +#: amelie/education/models.py:270 templates/basis.html:231 templates/frontpage.html:232 msgid "Complaints" msgstr "Klachten" @@ -5458,20 +3980,15 @@ msgstr "Stem" msgid "Votes" msgstr "Stemmen" -#: amelie/education/templates/awards.html:4 -#: amelie/education/templates/awards.html:11 -#: amelie/education/templates/awards.html:28 templates/basis.html:233 +#: amelie/education/templates/awards.html:4 amelie/education/templates/awards.html:11 amelie/education/templates/awards.html:28 templates/basis.html:233 msgid "Education awards" msgstr "Onderwijsprijzen" #: amelie/education/templates/awards.html:30 msgid "There is currently no information available on the education awards." -msgstr "" -"Er is op het moment geen informatie beschikbaar over de onderwijsprijs." +msgstr "Er is op het moment geen informatie beschikbaar over de onderwijsprijs." -#: amelie/education/templates/category_edit.html:4 -#: amelie/education/templates/category_new.html:4 -#: amelie/education/templates/category_new.html:8 +#: amelie/education/templates/category_edit.html:4 amelie/education/templates/category_new.html:4 amelie/education/templates/category_new.html:8 msgid "New category" msgstr "Nieuwe categorie" @@ -5483,11 +4000,7 @@ msgstr "Categorie opslaan" msgid "Create category" msgstr "Categorie aanmaken" -#: amelie/education/templates/complaint.html:34 -#: amelie/education/templates/complaint.html:123 -#: amelie/education/templates/complaints.html:69 -#: amelie/education/templates/complaints.html:129 -#: amelie/education/templates/complaints.html:196 +#: amelie/education/templates/complaint.html:34 amelie/education/templates/complaint.html:123 amelie/education/templates/complaints.html:69 amelie/education/templates/complaints.html:129 amelie/education/templates/complaints.html:196 #, python-format msgid "Added %(time)s ago" msgstr "%(time)s geleden geplaatst" @@ -5509,15 +4022,11 @@ msgstr "Klacht heropenen" msgid "This complaint has %(amount)s people supporting it." msgstr "Deze klacht heeft %(amount)s medestander(s)." -#: amelie/education/templates/complaint.html:69 -#: amelie/education/templates/complaints.html:80 -#: amelie/education/templates/complaints.html:140 +#: amelie/education/templates/complaint.html:69 amelie/education/templates/complaints.html:80 amelie/education/templates/complaints.html:140 msgid "I suffer from these problems too" msgstr "Je hebt hier ook last van" -#: amelie/education/templates/complaint.html:70 -#: amelie/education/templates/complaints.html:78 -#: amelie/education/templates/complaints.html:138 +#: amelie/education/templates/complaint.html:70 amelie/education/templates/complaints.html:78 amelie/education/templates/complaints.html:138 msgid "I do not suffer from this" msgstr "Geen last van" @@ -5525,9 +4034,7 @@ msgstr "Geen last van" msgid "You have not indicated this bothers you, too" msgstr "Je hebt niet aangegeven hier last van te hebben" -#: amelie/education/templates/complaint.html:73 -#: amelie/education/templates/complaints.html:83 -#: amelie/education/templates/complaints.html:143 +#: amelie/education/templates/complaint.html:73 amelie/education/templates/complaints.html:83 amelie/education/templates/complaints.html:143 msgid "Agree with this complaint" msgstr "Ook last van" @@ -5539,10 +4046,7 @@ msgstr "Je bent de melder van deze klacht" msgid "This complaint is anonymous" msgstr "Deze klacht is anoniem ingediend" -#: amelie/education/templates/complaint.html:85 -#: amelie/education/templates/complaints.html:44 -#: amelie/education/templates/complaints.html:110 -#: amelie/education/templates/complaints.html:181 +#: amelie/education/templates/complaint.html:85 amelie/education/templates/complaints.html:44 amelie/education/templates/complaints.html:110 amelie/education/templates/complaints.html:181 msgid "This complaint is not public" msgstr "Deze klacht is niet publiek" @@ -5550,10 +4054,7 @@ msgstr "Deze klacht is niet publiek" msgid "This complaint is dealt with" msgstr "Deze klacht is afgehandeld" -#: amelie/education/templates/complaint.html:95 -#: amelie/education/templates/complaints.html:170 -#: amelie/room_duty/models.py:254 -#: amelie/room_duty/templates/room_duty/table/fill.html:22 +#: amelie/education/templates/complaint.html:95 amelie/education/templates/complaints.html:170 amelie/room_duty/models.py:254 amelie/room_duty/templates/room_duty/table/fill.html:22 msgid "Comments" msgstr "Opmerkingen" @@ -5562,21 +4063,14 @@ msgid "Comment by Education Committee" msgstr "Opmerking van Onderwijscommissie" #: amelie/education/templates/complaint.html:112 -msgid "" -"This message is visible only to the original poster, the commenter and the " -"Committee of Education" -msgstr "" -"Dit bericht is alleen voor de melder, de plaatser van de opmerking en de " -"Onderwijscommissie" +msgid "This message is visible only to the original poster, the commenter and the Committee of Education" +msgstr "Dit bericht is alleen voor de melder, de plaatser van de opmerking en de Onderwijscommissie" -#: amelie/education/templates/complaint.html:131 -#: amelie/news/templates/news_item.html:24 -#: amelie/news/templates/news_item_delete.html:15 +#: amelie/education/templates/complaint.html:131 amelie/news/templates/news_item.html:24 amelie/news/templates/news_item_delete.html:15 msgid "Remove message" msgstr "Verwijder bericht" -#: amelie/education/templates/complaint.html:132 -#: amelie/news/templates/news_item.html:21 +#: amelie/education/templates/complaint.html:132 amelie/news/templates/news_item.html:21 msgid "Edit message" msgstr "Wijzig bericht" @@ -5589,53 +4083,38 @@ msgid "Add comment" msgstr "Plaats opmerking" #: amelie/education/templates/complaint.html:165 -msgid "" -"Comments with private information can also be send directly to the Officer " -"of Educational Affairs" -msgstr "" -"Opmerkingen met persoonlijke informatie kunnen ook direct naar de Commisaris " -"Onderwijszaken gestuurd worden" +msgid "Comments with private information can also be send directly to the Officer of Educational Affairs" +msgstr "Opmerkingen met persoonlijke informatie kunnen ook direct naar de Commisaris Onderwijszaken gestuurd worden" #: amelie/education/templates/complaint.html:175 msgid "Make this message visible to anyone" msgstr "Dit bericht voor iedereen zichtbaar maken" #: amelie/education/templates/complaint.html:176 -msgid "" -"Non-public comments are visible to the commenter, the person who filed the " -"complaint and the Education Committee" -msgstr "" -"Niet-publieke opmerkingen zijn zichtbaar voor de plaatser, de originele " -"melder van de klacht en de Onderwijscommissie" +msgid "Non-public comments are visible to the commenter, the person who filed the complaint and the Education Committee" +msgstr "Niet-publieke opmerkingen zijn zichtbaar voor de plaatser, de originele melder van de klacht en de Onderwijscommissie" #: amelie/education/templates/complaint.html:182 msgid "Post this comment as Education Committee" msgstr "Plaats deze opmerking als Onderwijscommissie lid" #: amelie/education/templates/complaint.html:183 -msgid "" -"If you post this comment as member of the Education Committee, the comment " -"will be marked with a red badge" -msgstr "" -"Als je deze opmerking plaatst als Onderwijscommissie lid komt er een rode " -"badge bij te staan" +msgid "If you post this comment as member of the Education Committee, the comment will be marked with a red badge" +msgstr "Als je deze opmerking plaatst als Onderwijscommissie lid komt er een rode badge bij te staan" #: amelie/education/templates/complaint.html:188 msgid "Post" msgstr "Plaatsen" -#: amelie/education/templates/complaint_new.html:4 -#: amelie/education/templates/complaint_new.html:8 +#: amelie/education/templates/complaint_new.html:4 amelie/education/templates/complaint_new.html:8 msgid "Add complaint" msgstr "Klacht indienen" #: amelie/education/templates/complaint_new.html:12 msgid "" "\n" -" Because not everything always goes smoothly, you can " -"file a complaint/ comment here.\n" -" Please check the overview of complaints for your " -"complaint before posting, so you can support it.\n" +" Because not everything always goes smoothly, you can file a complaint/ comment here.\n" +" Please check the overview of complaints for your complaint before posting, so you can support it.\n" " This way, you won't have to file a new complaint.\n" " " msgstr "" @@ -5651,12 +4130,8 @@ msgid "Subject of the complaint" msgstr "Onderwerp van de klacht" #: amelie/education/templates/complaint_new.html:34 -msgid "" -"Firstly, what does your complaint concern? Remember: teacher have 10 working " -"days to grade your exams!" -msgstr "" -"Allereerst de vraag waar de klacht over gaat. Let op: de nakijktermijn van " -"een tentamen is 10 werkdagen!" +msgid "Firstly, what does your complaint concern? Remember: teacher have 10 working days to grade your exams!" +msgstr "Allereerst de vraag waar de klacht over gaat. Let op: de nakijktermijn van een tentamen is 10 werkdagen!" #: amelie/education/templates/complaint_new.html:41 msgid "Course or Module" @@ -5670,16 +4145,11 @@ msgstr "Als het om een vak of module gaat, kun je die hier uitzoeken" #, python-format msgid "" "\n" -" There is a chance that the course or module you are " -"looking for does not yet exist. If so, please create a new course or a new module.\n" +" There is a chance that the course or module you are looking for does not yet exist. If so, please create a new course or a new module.\n" " " msgstr "" "\n" -"Het kan zijn dat het vak dat je zoekt nog niet bestaat. Als dat zo is, maak " -"dan a.u.b. een nieuw vak of een nieuwe module aan." +"Het kan zijn dat het vak dat je zoekt nog niet bestaat. Als dat zo is, maak dan a.u.b. een nieuw vak of een nieuwe module aan." #: amelie/education/templates/complaint_new.html:59 msgid "Academic year and period of the course:" @@ -5692,55 +4162,35 @@ msgstr "Jaar waarin het studiejaar begon" #: amelie/education/templates/complaint_new.html:75 msgid "" "\n" -" Please state clearly your problem and the actions " -"you have already taken to solve it\n" -" (for example, e-mailing the teacher or module " -"coordinator).\n" +" Please state clearly your problem and the actions you have already taken to solve it\n" +" (for example, e-mailing the teacher or module coordinator).\n" " Also include the name of the teacher of the course.\n" -" If the complaint is about an exceeded marking " -"period, be sure to state the date of the\n" +" If the complaint is about an exceeded marking period, be sure to state the date of the\n" " test/assignment deadline.\n" -" Preferably describe your complaint in English to " -"make sure other students can understand it (later).\n" -" In case you'd rather do this in Dutch, that's fine " -"as well.\n" +" Preferably describe your complaint in English to make sure other students can understand it (later).\n" +" In case you'd rather do this in Dutch, that's fine as well.\n" " " msgstr "" "\n" "Vertel ons helder wat er aan de hand is en welke acties\n" "je al ondernomen hebt om iets aan je probleem te doen\n" "(bijvoorbeeld het e-mailen van de docent of de modulecoordinator).\n" -"Geef ook aan wie de docent is van het vak, en als het gaat om een verlopen " -"nakijktermijn,\n" -"laat ook weten wat de datum van de toets of de deadline van de opdracht " -"was.\n" -"Geef gelieve je klacht in het Engels zodat andere studenten het (later) " -"kunnen begrijpen. Mocht je dit liever in het Nederlands doen, dan is dat ook " -"mogelijk." +"Geef ook aan wie de docent is van het vak, en als het gaat om een verlopen nakijktermijn,\n" +"laat ook weten wat de datum van de toets of de deadline van de opdracht was.\n" +"Geef gelieve je klacht in het Engels zodat andere studenten het (later) kunnen begrijpen. Mocht je dit liever in het Nederlands doen, dan is dat ook mogelijk." #: amelie/education/templates/complaint_new.html:87 msgid "" "\n" -" Please contact the teacher of the subject and/or the " -"module coordinator about the issue before\n" -" submitting a complaint. Oftentimes, complaints can " -"be solved much quicker and easier with\n" -" direct contact than through Inter-Actief. " -"By submitting a complaint here, you indicate\n" -" to us that you have raised the issue with the " -"teacher or module coordinator, and that this\n" -" did not lead to an acceptable resolution of the " -"issue.\n" +" Please contact the teacher of the subject and/or the module coordinator about the issue before\n" +" submitting a complaint. Oftentimes, complaints can be solved much quicker and easier with\n" +" direct contact than through Inter-Actief. By submitting a complaint here, you indicate\n" +" to us that you have raised the issue with the teacher or module coordinator, and that this\n" +" did not lead to an acceptable resolution of the issue.\n" " " msgstr "" "\n" -"Neem alsjeblieft eerst contact op met de docent van het vak en/of de " -"modulecoördinator over dit probleem voordat je een klacht indient. Vaak " -"kunnen klachten veel sneller en gemakkelijker opgelost worden door middel " -"van direct contact dan via Inter-Actief. Door hier een klacht in " -"te dienen, geef je aan ons aan dat je dit probleem aan de orde hebt gesteld " -"bij de docent of de modulecoördinator, en dat dit niet tot een acceptabele " -"oplossing van het probleem heeft geleid." +"Neem alsjeblieft eerst contact op met de docent van het vak en/of de modulecoördinator over dit probleem voordat je een klacht indient. Vaak kunnen klachten veel sneller en gemakkelijker opgelost worden door middel van direct contact dan via Inter-Actief. Door hier een klacht in te dienen, geef je aan ons aan dat je dit probleem aan de orde hebt gesteld bij de docent of de modulecoördinator, en dat dit niet tot een acceptabele oplossing van het probleem heeft geleid." #: amelie/education/templates/complaint_new.html:112 msgid "Complaint-preferences" @@ -5751,12 +4201,8 @@ msgid "Lastly, we have three more questions for you" msgstr "Als laatste hebben we nog drie vragen" #: amelie/education/templates/complaint_new.html:119 -msgid "" -"Include this complaint in the overview, so other members can see and support " -"it" -msgstr "" -"Neem deze klacht op in het overzicht zodat andere leden deze kunnen zien en " -"zich er bij aan kunnen sluiten" +msgid "Include this complaint in the overview, so other members can see and support it" +msgstr "Neem deze klacht op in het overzicht zodat andere leden deze kunnen zien en zich er bij aan kunnen sluiten" #: amelie/education/templates/complaint_new.html:119 msgid "Your name will not be shown in the overview" @@ -5767,12 +4213,8 @@ msgid "Keep me updated by e-mail" msgstr "Mail mij als er feedback op wordt geplaatst" #: amelie/education/templates/complaint_new.html:125 -msgid "" -"Handle my complaint anonymously (only the board can see who filed the " -"complaint)" -msgstr "" -"Behandel mijn klacht anoniem (alleen bestuur kan zien van wie de klacht " -"afkomt)" +msgid "Handle my complaint anonymously (only the board can see who filed the complaint)" +msgstr "Behandel mijn klacht anoniem (alleen bestuur kan zien van wie de klacht afkomt)" #: amelie/education/templates/complaint_new.html:128 msgid "You can now hand in your complaint. Thank you!" @@ -5782,20 +4224,16 @@ msgstr "Je kunt de klacht nu indienen, bedankt!" msgid "Submit" msgstr "Indienen" -#: amelie/education/templates/complaints.html:4 -#: amelie/education/templates/complaints.html:8 +#: amelie/education/templates/complaints.html:4 amelie/education/templates/complaints.html:8 msgid "Complaint overview" msgstr "Klachtenoverzicht" #: amelie/education/templates/complaints.html:12 msgid "" "\n" -" Not everything in your study is smooth sailing, and you " -"are not always the cause of it.\n" -" Public complaints that are reported to us are listed " -"below.\n" -" You can support a complaint, comment on it, or file a " -"new complaint.\n" +" Not everything in your study is smooth sailing, and you are not always the cause of it.\n" +" Public complaints that are reported to us are listed below.\n" +" You can support a complaint, comment on it, or file a new complaint.\n" " " msgstr "" "\n" @@ -5812,20 +4250,15 @@ msgstr "Er zijn geen publieke openstaande klachten" msgid "File new complaint" msgstr "Nieuwe klacht indienen" -#: amelie/education/templates/complaints.html:41 -#: amelie/education/templates/complaints.html:107 +#: amelie/education/templates/complaints.html:41 amelie/education/templates/complaints.html:107 msgid "This is your complaint" msgstr "Dit is jouw klacht" -#: amelie/education/templates/complaints.html:53 -#: amelie/education/templates/complaints.html:113 -#: amelie/education/templates/complaints.html:167 +#: amelie/education/templates/complaints.html:53 amelie/education/templates/complaints.html:113 amelie/education/templates/complaints.html:167 msgid "Number of fellow students with the same complaint" msgstr "Aantal mensen die er last van hebben" -#: amelie/education/templates/complaints.html:54 -#: amelie/education/templates/complaints.html:114 -#: amelie/education/templates/complaints.html:170 +#: amelie/education/templates/complaints.html:54 amelie/education/templates/complaints.html:114 amelie/education/templates/complaints.html:170 msgid "Number of comments" msgstr "Aantal opmerkingen geplaatst" @@ -5845,8 +4278,7 @@ msgstr "Medestanders" msgid "These complaints have been received concerning this course" msgstr "Over dit vak zijn de volgende klachten binnengekomen" -#: amelie/education/templates/course_new.html:4 -#: amelie/education/templates/course_new.html:10 +#: amelie/education/templates/course_new.html:4 amelie/education/templates/course_new.html:10 msgid "Add course" msgstr "Vak toevoegen" @@ -5862,8 +4294,7 @@ msgstr "Nominatie Onderwijsprijs" msgid "Education award nomination" msgstr "Onderwijsprijs nominatie" -#: amelie/education/templates/dea_nomination.html:11 -#: amelie/education/templates/dea_vote.html:11 +#: amelie/education/templates/dea_nomination.html:11 amelie/education/templates/dea_vote.html:11 msgid "Which teacher should receive the Educational Award?" msgstr "Welke docent moet de onderwijsprijs krijgen?" @@ -5875,20 +4306,15 @@ msgstr "Je naam" msgid "Your e-mail address" msgstr "Je emailadres" -#: amelie/education/templates/dea_nomination.html:38 -#: amelie/education/templates/dea_vote.html:21 +#: amelie/education/templates/dea_nomination.html:38 amelie/education/templates/dea_vote.html:21 msgid "Recover all data" msgstr "Herstel alle gegevens" -#: amelie/education/templates/dea_nomination.html:39 -#: amelie/education/templates/dea_vote.html:22 -#: amelie/education/templates/educational_bouquet.html:44 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:248 +#: amelie/education/templates/dea_nomination.html:39 amelie/education/templates/dea_vote.html:22 amelie/education/templates/educational_bouquet.html:44 amelie/weekmail/templates/weekmail/weekmail_wizard.html:248 msgid "Send" msgstr "Verzenden" -#: amelie/education/templates/dea_vote.html:4 -#: amelie/education/templates/dea_vote.html:8 +#: amelie/education/templates/dea_vote.html:4 amelie/education/templates/dea_vote.html:8 msgid "Vote for the Educational Award" msgstr "Stem voor de onderwijsprijs" @@ -5901,10 +4327,7 @@ msgstr "Ik had college van deze docent(en)" msgid "Complaint handled: %(complaint_subject)s" msgstr "Klacht afgehandeld: %(complaint_subject)s" -#: amelie/education/templates/education/complaint_closed.mail:7 -#: amelie/education/templates/education/complaint_comment.mail:6 -#: amelie/education/templates/education/complaint_notification.mail:6 -#: amelie/education/templates/education/new_complaint_notification.mail:6 +#: amelie/education/templates/education/complaint_closed.mail:7 amelie/education/templates/education/complaint_comment.mail:6 amelie/education/templates/education/complaint_notification.mail:6 amelie/education/templates/education/new_complaint_notification.mail:6 msgid "Dear EC member," msgstr "Beste EC'er," @@ -5927,19 +4350,15 @@ msgstr "" "\n" "Met vriendelijke groet," -#: amelie/education/templates/education/complaint_comment.mail:4 -#: amelie/education/templates/education/complaint_progress.mail:4 +#: amelie/education/templates/education/complaint_comment.mail:4 amelie/education/templates/education/complaint_progress.mail:4 #, python-format msgid "Progress complaint %(complaint_subject)s" msgstr "Voortgang klacht %(complaint_subject)s" #: amelie/education/templates/education/complaint_comment.mail:8 #, python-format -msgid "" -"%(complaint_reporter)s posted a comment on complaint %(complaint_subject)s:" -msgstr "" -"%(complaint_reporter)s heeft bij %(complaint_subject)s een opmerking " -"geplaatst:" +msgid "%(complaint_reporter)s posted a comment on complaint %(complaint_subject)s:" +msgstr "%(complaint_reporter)s heeft bij %(complaint_subject)s een opmerking geplaatst:" #: amelie/education/templates/education/complaint_comment.mail:10 #, python-format @@ -5967,12 +4386,8 @@ msgstr "Klacht ingediend over %(complaint_subject)s" #: amelie/education/templates/education/complaint_notification.mail:8 #, python-format -msgid "" -"%(complaint_reporter)s submitted a complaint about the course " -"%(complaint_courseperiod)s." -msgstr "" -"%(complaint_reporter)s heeft een klacht geplaatst over het vak ." -"%(complaint_courseperiod)s" +msgid "%(complaint_reporter)s submitted a complaint about the course %(complaint_courseperiod)s." +msgstr "%(complaint_reporter)s heeft een klacht geplaatst over het vak .%(complaint_courseperiod)s" #: amelie/education/templates/education/complaint_notification.mail:9 #, python-format @@ -6009,8 +4424,7 @@ msgid "" msgstr "" "Beste %(complaint.reporter.first_name)s,\n" "\n" -"%(complaint_comment_person)s heeft een opmerking geplaatst bij jouw " -"onderwijsklacht.\n" +"%(complaint_comment_person)s heeft een opmerking geplaatst bij jouw onderwijsklacht.\n" "\n" "URL: " @@ -6078,8 +4492,7 @@ msgid "" msgstr "" "Beste EC'er,\n" "\n" -"%(person)s (%(student_number)s) heeft een stem uitgebracht voor de " -"onderwijsprijs!\n" +"%(person)s (%(student_number)s) heeft een stem uitgebracht voor de onderwijsprijs!\n" "\n" "Het gaat om docent %(teacher)s.\n" "%(person)s heeft college van de volgende docenten gehad: %(lecture)s.\n" @@ -6125,10 +4538,8 @@ msgstr "Klacht ingediend over %(complaint_course)s" #: amelie/education/templates/education/new_complaint_notification.mail:8 #, python-format -msgid "" -"Someone submitted a complaint about the course %(complaint_courseperiod)s." -msgstr "" -"Iemand heeft een klacht geplaatst over het vak %(complaint_courseperiod)s." +msgid "Someone submitted a complaint about the course %(complaint_courseperiod)s." +msgstr "Iemand heeft een klacht geplaatst over het vak %(complaint_courseperiod)s." #: amelie/education/templates/education/new_complaint_notification.mail:9 msgid "Someone submitted a complaint." @@ -6167,35 +4578,27 @@ msgstr "Onderwijsactiviteit toevoegen" msgid "Edit educational activity" msgstr "Onderwijsactiviteit wijzigen" -#: amelie/education/templates/education_event_overview.html:4 -#: amelie/education/templates/education_event_overview.html:8 +#: amelie/education/templates/education_event_overview.html:4 amelie/education/templates/education_event_overview.html:8 msgid "Educational activities" msgstr "Onderwijsactiviteiten" -#: amelie/education/templates/education_event_overview.html:16 -#: amelie/education/templates/education_event_overview.html:66 +#: amelie/education/templates/education_event_overview.html:16 amelie/education/templates/education_event_overview.html:66 msgid "Educational activity" msgstr "Onderwijsactiviteit" -#: amelie/education/templates/education_news.html:5 -#: amelie/news/templates/news_items.html:5 templates/basis.html:138 -#: templates/frontpage.html:144 +#: amelie/education/templates/education_news.html:5 amelie/news/templates/news_items.html:5 templates/basis.html:138 templates/frontpage.html:144 msgid "News" msgstr "Nieuws" -#: amelie/education/templates/education_news.html:26 -#: amelie/news/templates/news_items.html:27 +#: amelie/education/templates/education_news.html:26 amelie/news/templates/news_items.html:27 msgid "No articles" msgstr "Geen artikelen" -#: amelie/education/templates/education_news.html:28 -#: amelie/news/templates/news_items.html:29 +#: amelie/education/templates/education_news.html:28 amelie/news/templates/news_items.html:29 msgid "There are no education news articles available." msgstr "Er zijn geen onderwijsnieuwsberichten beschikbaar." -#: amelie/education/templates/educational_bouquet.html:4 -#: amelie/education/templates/educational_bouquet.html:10 -#: templates/basis.html:232 +#: amelie/education/templates/educational_bouquet.html:4 amelie/education/templates/educational_bouquet.html:10 templates/basis.html:232 msgid "Educational bouquet" msgstr "Onderwijsbloemetje" @@ -6206,48 +4609,32 @@ msgstr "Bedankt voor het insturen van je onderwijsbloemetje!" #: amelie/education/templates/educational_bouquet.html:19 msgid "" "\n" -" Do you know someone who is extremely committed to improve " -"the quality of education or is always willing to help students without " -"hesitation?\n" -" Then, what are you waiting for? Nominate him or her for " -"the education bouquet!\n" +" Do you know someone who is extremely committed to improve the quality of education or is always willing to help students without hesitation?\n" +" Then, what are you waiting for? Nominate him or her for the education bouquet!\n" " " msgstr "" "\n" -"Ken jij iemand die zich buitengewoon heeft ingezet voor het onderwijs en " -"altijd klaarstaat om studenten te helpen? Nomineer hem/haar dan voor een " -"onderwijsbloemetje!" +"Ken jij iemand die zich buitengewoon heeft ingezet voor het onderwijs en altijd klaarstaat om studenten te helpen? Nomineer hem/haar dan voor een onderwijsbloemetje!" #: amelie/education/templates/educational_bouquet.html:25 msgid "" "\n" -" Think for example of a teacher who gives extra lectures or " -"a student assistant who is making hours in overtime to help each and " -"everyone of you!\n" -" You can nominate someone filling in and sending the form " -"below.\n" +" Think for example of a teacher who gives extra lectures or a student assistant who is making hours in overtime to help each and everyone of you!\n" +" You can nominate someone filling in and sending the form below.\n" " " msgstr "" "\n" -"Denk bijvoorbeeld aan een docent die extra colleges geeft, of een " -"studentassistent die overuren draait om iedereen te helpen. Je kan iemand " -"nomineren door het volgende formulier in te vullen en te verzenden." +"Denk bijvoorbeeld aan een docent die extra colleges geeft, of een studentassistent die overuren draait om iedereen te helpen. Je kan iemand nomineren door het volgende formulier in te vullen en te verzenden." #: amelie/education/templates/educational_bouquet.html:34 #, python-format msgid "" "\n" -" There is a chance that the course or module you are " -"looking for does not yet exist. If so, please create a new course or a new module.\n" +" There is a chance that the course or module you are looking for does not yet exist. If so, please create a new course or a new module.\n" " " msgstr "" "\n" -"Het kan zijn dat het vak dat je zoekt nog niet bestaat. Als dat zo is, maak " -"dan a.u.b. een nieuw vak of een nieuwe module aan." +"Het kan zijn dat het vak dat je zoekt nog niet bestaat. Als dat zo is, maak dan a.u.b. een nieuw vak of een nieuwe module aan." #: amelie/education/templates/educational_bouquet.html:54 msgid "Previous bouquets" @@ -6257,8 +4644,7 @@ msgstr "Vorige bloemetjes" msgid "These complaints have been received concerning this module" msgstr "Over deze module zijn de volgende klachten binnengekomen" -#: amelie/education/templates/module_new.html:4 -#: amelie/education/templates/module_new.html:10 +#: amelie/education/templates/module_new.html:4 amelie/education/templates/module_new.html:10 msgid "Add module" msgstr "Module toevoegen" @@ -6270,8 +4656,7 @@ msgstr "Vakcode van de module" msgid "Education" msgstr "Onderwijs" -#: amelie/education/templates/overview.html:12 amelie/members/models.py:913 -#: templates/basis.html:226 +#: amelie/education/templates/overview.html:12 amelie/members/models.py:913 templates/basis.html:226 msgid "Information" msgstr "Informatie" @@ -6313,15 +4698,12 @@ msgstr "Zoek een vak" #: amelie/education/templates/summaries.html:25 msgid "" "\n" -" This content is not managed by Inter-Actief, but by " -"SamenvattingenWiki (SummariesWiki).\n" +" This content is not managed by Inter-Actief, but by SamenvattingenWiki (SummariesWiki).\n" " " msgstr "" "\n" "Deze inhoud wordt niet beheerd door Inter-Actief, maar door\n" -"SamenvattingenWiki." +"SamenvattingenWiki." #: amelie/files/models.py:149 msgid "Appendix" @@ -6335,8 +4717,7 @@ msgstr "Bestand niet gevonden" msgid "Stay logged in" msgstr "Blijf ingelogd" -#: amelie/gmm/templates/gmm_overview.html:5 -#: amelie/gmm/templates/gmm_overview.html:29 templates/basis.html:185 +#: amelie/gmm/templates/gmm_overview.html:5 amelie/gmm/templates/gmm_overview.html:29 templates/basis.html:185 msgid "GMM documents" msgstr "ALV-stukken" @@ -6349,26 +4730,16 @@ msgid "Upcoming GMM" msgstr "Aankomende ALV" #: amelie/gmm/templates/gmm_overview.html:32 -msgid "" -"For a General Members Meeting there are almost always different documents " -"available to offer everyone the opportunity to prepare themselves. On this " -"page the documents for the differetn GMMs are available for download." -msgstr "" -"Voor een Algemene Ledenvergadering zijn vrijwel altijd verschillende stukken " -"beschikbaar, om iedereen de mogelijkheid te bieden zich goed voor te " -"bereiden. Op deze pagina zijn de stukken voor de verschillende ALV's te " -"downloaden." +msgid "For a General Members Meeting there are almost always different documents available to offer everyone the opportunity to prepare themselves. On this page the documents for the differetn GMMs are available for download." +msgstr "Voor een Algemene Ledenvergadering zijn vrijwel altijd verschillende stukken beschikbaar, om iedereen de mogelijkheid te bieden zich goed voor te bereiden. Op deze pagina zijn de stukken voor de verschillende ALV's te downloaden." #: amelie/gmm/templates/gmm_overview.html:37 msgid "Articles of Association, Rules and Regulations and other documents" msgstr "Statuten, HR en andere documenten" #: amelie/gmm/templates/gmm_overview.html:40 -msgid "" -"For formal association documents, only the Dutch version is legally binding." -msgstr "" -"Bij formele verenigingsdocumenten is alleen de Nederlandse versie " -"rechtsgeldig." +msgid "For formal association documents, only the Dutch version is legally binding." +msgstr "Bij formele verenigingsdocumenten is alleen de Nederlandse versie rechtsgeldig." #: amelie/gmm/templates/gmm_overview.html:73 msgid "Documents for upcoming GMM" @@ -6394,18 +4765,14 @@ msgid "" " P.O. Box 217
    \n" " 7500 AE Enschede
    \n" " 053 - 489 3756
    \n" -" contact@inter-actief.net
    \n" -" https://www.inter-actief.net/\n" +" contact@inter-actief.net
    \n" +" https://www.inter-actief.net/\n" " " msgstr "" "\n" "I.C.T.S.V. Inter-Actief
    \n" -"contact@inter-actief.net
    \n" -"http://www." -"inter-actief.net/" +"contact@inter-actief.net
    \n" +"http://www.inter-actief.net/" #: amelie/iamailer/templates/iamailer/email_basic.mail:54 msgid "" @@ -6425,14 +4792,11 @@ msgstr "Change language preference/Voorkeurstaal wijzigen:" msgid "Delivery report" msgstr "Afleverrapport" -#: amelie/iamailer/templates/iamailer/report.mail:8 -#: amelie/iamailer/templates/iamailer/report.mail:36 -#: amelie/tools/templates/tools/push_report.mail:6 +#: amelie/iamailer/templates/iamailer/report.mail:8 amelie/iamailer/templates/iamailer/report.mail:36 amelie/tools/templates/tools/push_report.mail:6 msgid "Hey there," msgstr "Hallo daar," -#: amelie/iamailer/templates/iamailer/report.mail:12 -#: amelie/iamailer/templates/iamailer/report.mail:38 +#: amelie/iamailer/templates/iamailer/report.mail:12 amelie/iamailer/templates/iamailer/report.mail:38 msgid "You receive this e-mail report because you send a mailing." msgstr "Je ontvangt dit e-mailrapport omdat je een mailing verstuurd hebt." @@ -6440,92 +4804,40 @@ msgstr "Je ontvangt dit e-mailrapport omdat je een mailing verstuurd hebt." #, python-format msgid "" "\n" -" %(mail_count)s messages have been sent. %(sent_count)s of these have " -"been accepted and %(error_count)s have not.\n" +" %(mail_count)s messages have been sent. %(sent_count)s of these have been accepted and %(error_count)s have not.\n" " " msgstr "" "\n" -"Er zijn %(mail_count)s berichten verstuurd. Hiervan zijn er %(sent_count)s " -"geaccepteerd en %(error_count)s niet geaccepteerd." +"Er zijn %(mail_count)s berichten verstuurd. Hiervan zijn er %(sent_count)s geaccepteerd en %(error_count)s niet geaccepteerd." -#: amelie/iamailer/templates/iamailer/report.mail:23 -#: amelie/iamailer/templates/iamailer/report.mail:42 -msgid "" -"The construction or sending of the message has failed for the following " -"people:" -msgstr "" -"Bij de volgende personen is het opstellen of verzenden van het bericht " -"mislukt:" +#: amelie/iamailer/templates/iamailer/report.mail:23 amelie/iamailer/templates/iamailer/report.mail:42 +msgid "The construction or sending of the message has failed for the following people:" +msgstr "Bij de volgende personen is het opstellen of verzenden van het bericht mislukt:" #: amelie/iamailer/templates/iamailer/report.mail:40 #, python-format -msgid "" -"%(mail_count)s have been sent. Of these %(sent_count)s have been accepted " -"and %(error_count)s have not." +msgid "%(mail_count)s have been sent. Of these %(sent_count)s have been accepted and %(error_count)s have not." msgstr "" -"Er zijn %(mail_count)s berichten verstuurd. Hiervan zijn er %(sent_count)s " -"geaccepteerd\n" +"Er zijn %(mail_count)s berichten verstuurd. Hiervan zijn er %(sent_count)s geaccepteerd\n" "en %(error_count)s niet geaccepteerd." -#: amelie/members/forms.py:33 amelie/members/models.py:310 -#: amelie/members/models.py:1096 -#: amelie/members/templates/includes/person_data_table.html:27 -#: amelie/members/templates/includes/registration/data_overview_employee.html:11 -#: amelie/members/templates/includes/registration/data_overview_external.html:11 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:11 -#: amelie/members/templates/includes/registration/data_overview_general.html:11 -#: amelie/members/templates/includes/registration/personal_details.html:55 -#: amelie/members/templates/includes/registration/personal_details_employee.html:55 -#: amelie/members/templates/members/datablock_html.mail:9 -#: amelie/members/templates/members/datablock_plain.mail:8 -#: amelie/tools/pdf.py:100 +#: amelie/members/forms.py:33 amelie/members/models.py:310 amelie/members/models.py:1096 amelie/members/templates/includes/person_data_table.html:27 amelie/members/templates/includes/registration/data_overview_employee.html:11 amelie/members/templates/includes/registration/data_overview_external.html:11 amelie/members/templates/includes/registration/data_overview_freshmen.html:11 amelie/members/templates/includes/registration/data_overview_general.html:11 amelie/members/templates/includes/registration/personal_details.html:55 amelie/members/templates/includes/registration/personal_details_employee.html:55 amelie/members/templates/members/datablock_html.mail:9 amelie/members/templates/members/datablock_plain.mail:8 amelie/tools/pdf.py:100 msgid "Gender" msgstr "Geslacht" -#: amelie/members/forms.py:34 amelie/members/models.py:312 -#: amelie/members/models.py:1098 -#: amelie/members/templates/includes/person_data_table.html:33 -#: amelie/members/templates/includes/registration/data_overview_employee.html:17 -#: amelie/members/templates/includes/registration/data_overview_external.html:17 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:17 -#: amelie/members/templates/includes/registration/data_overview_general.html:17 -#: amelie/members/templates/includes/registration/personal_details.html:81 -#: amelie/members/templates/includes/registration/personal_details_employee.html:81 -#: amelie/members/templates/members/datablock_html.mail:10 -#: amelie/members/templates/members/datablock_plain.mail:9 -#: amelie/tools/pdf.py:104 +#: amelie/members/forms.py:34 amelie/members/models.py:312 amelie/members/models.py:1098 amelie/members/templates/includes/person_data_table.html:33 amelie/members/templates/includes/registration/data_overview_employee.html:17 amelie/members/templates/includes/registration/data_overview_external.html:17 amelie/members/templates/includes/registration/data_overview_freshmen.html:17 amelie/members/templates/includes/registration/data_overview_general.html:17 amelie/members/templates/includes/registration/personal_details.html:81 amelie/members/templates/includes/registration/personal_details_employee.html:81 amelie/members/templates/members/datablock_html.mail:10 amelie/members/templates/members/datablock_plain.mail:9 amelie/tools/pdf.py:104 msgid "Language of preference" msgstr "Voorkeurstaal" -#: amelie/members/forms.py:36 amelie/members/models.py:314 -#: amelie/members/models.py:1100 -#: amelie/members/templates/includes/person_data_table.html:30 -#: amelie/members/templates/includes/registration/personal_details.html:93 +#: amelie/members/forms.py:36 amelie/members/models.py:314 amelie/members/models.py:1100 amelie/members/templates/includes/person_data_table.html:30 amelie/members/templates/includes/registration/personal_details.html:93 msgid "International student" msgstr "Internationale student" -#: amelie/members/forms.py:37 amelie/members/models.py:316 -#: amelie/members/models.py:1101 -#: amelie/members/templates/includes/person_data_table.html:23 -#: amelie/members/templates/includes/registration/data_overview_employee.html:8 -#: amelie/members/templates/includes/registration/data_overview_external.html:8 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:8 -#: amelie/members/templates/includes/registration/data_overview_general.html:8 -#: amelie/members/templates/includes/registration/personal_details.html:42 -#: amelie/members/templates/includes/registration/personal_details_employee.html:42 -#: amelie/members/templates/members/datablock_html.mail:7 -#: amelie/members/templates/members/datablock_plain.mail:6 -#: amelie/tools/pdf.py:102 +#: amelie/members/forms.py:37 amelie/members/models.py:316 amelie/members/models.py:1101 amelie/members/templates/includes/person_data_table.html:23 amelie/members/templates/includes/registration/data_overview_employee.html:8 amelie/members/templates/includes/registration/data_overview_external.html:8 amelie/members/templates/includes/registration/data_overview_freshmen.html:8 amelie/members/templates/includes/registration/data_overview_general.html:8 amelie/members/templates/includes/registration/personal_details.html:42 amelie/members/templates/includes/registration/personal_details_employee.html:42 amelie/members/templates/members/datablock_html.mail:7 amelie/members/templates/members/datablock_plain.mail:6 amelie/tools/pdf.py:102 msgid "Birth date" msgstr "Geboortedatum" -#: amelie/members/forms.py:39 amelie/members/models.py:350 -#: amelie/members/models.py:1119 -#: amelie/members/templates/includes/query/query_preference.html:4 -#: amelie/members/templates/members/datablock_html.mail:24 -#: amelie/members/templates/members/datablock_plain.mail:22 -#: amelie/members/templates/person.html:62 amelie/tools/pdf.py:152 -#: templates/profile_edit.html:70 +#: amelie/members/forms.py:39 amelie/members/models.py:350 amelie/members/models.py:1119 amelie/members/templates/includes/query/query_preference.html:4 amelie/members/templates/members/datablock_html.mail:24 amelie/members/templates/members/datablock_plain.mail:22 amelie/members/templates/person.html:62 amelie/tools/pdf.py:152 templates/profile_edit.html:70 msgid "Preferences" msgstr "Voorkeuren" @@ -6539,8 +4851,7 @@ msgstr "Begonnen aan master" #: amelie/members/forms.py:107 msgid "Please fill in a start date when filling in a mastercourse." -msgstr "" -"Als je een master invult, moet je (minimaal) ook een begindatum invullen." +msgstr "Als je een master invult, moet je (minimaal) ook een begindatum invullen." #: amelie/members/forms.py:144 msgid "Suggestion:" @@ -6566,14 +4877,11 @@ msgstr "Per direct" msgid "At the end of the association year" msgstr "Aan het einde van het verenigingsjaar" -#: amelie/members/forms.py:276 amelie/members/forms.py:362 -#: amelie/members/forms.py:441 amelie/members/forms.py:653 +#: amelie/members/forms.py:276 amelie/members/forms.py:362 amelie/members/forms.py:441 amelie/members/forms.py:653 msgid "BIC has to be entered for foreign bankaccounts." msgstr "BIC moet ingevuld worden met een buitenlandse rekening" -#: amelie/members/forms.py:280 amelie/members/forms.py:366 -#: amelie/members/forms.py:445 amelie/members/forms.py:657 -#: amelie/personal_tab/forms.py:99 +#: amelie/members/forms.py:280 amelie/members/forms.py:366 amelie/members/forms.py:445 amelie/members/forms.py:657 amelie/personal_tab/forms.py:99 msgid "BIC could not be generated, please enter yourself." msgstr "Kon BIC niet automatisch bepalen, vul deze alsjeblieft zelf in." @@ -6581,83 +4889,41 @@ msgstr "Kon BIC niet automatisch bepalen, vul deze alsjeblieft zelf in." msgid "Choose a name from the suggestions." msgstr "Kies een naam uit de suggesties." -#: amelie/members/forms.py:322 amelie/members/forms.py:401 -#: amelie/members/forms.py:609 amelie/members/query_forms.py:84 -#: amelie/members/templates/includes/registration/authorizations.html:58 -#: amelie/members/templates/includes/registration/data_overview_employee.html:62 -#: amelie/members/templates/includes/registration/data_overview_external.html:62 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:94 -#: amelie/members/templates/includes/registration/data_overview_general.html:71 -#: amelie/personal_tab/forms.py:78 amelie/personal_tab/forms.py:118 -#: amelie/personal_tab/models.py:491 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:33 -#: amelie/tools/pdf.py:413 +#: amelie/members/forms.py:322 amelie/members/forms.py:401 amelie/members/forms.py:609 amelie/members/query_forms.py:84 amelie/members/templates/includes/registration/authorizations.html:58 amelie/members/templates/includes/registration/data_overview_employee.html:62 amelie/members/templates/includes/registration/data_overview_external.html:62 amelie/members/templates/includes/registration/data_overview_freshmen.html:94 amelie/members/templates/includes/registration/data_overview_general.html:71 amelie/personal_tab/forms.py:78 amelie/personal_tab/forms.py:118 amelie/personal_tab/models.py:491 amelie/personal_tab/templates/cookie_corner_authorization_view.html:33 amelie/tools/pdf.py:413 msgid "IBAN" msgstr "IBAN" -#: amelie/members/forms.py:323 amelie/members/forms.py:402 -#: amelie/members/forms.py:610 -#: amelie/members/templates/includes/registration/authorizations.html:71 -#: amelie/members/templates/includes/registration/data_overview_employee.html:65 -#: amelie/members/templates/includes/registration/data_overview_external.html:65 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:97 -#: amelie/members/templates/includes/registration/data_overview_general.html:74 -#: amelie/personal_tab/forms.py:119 amelie/personal_tab/models.py:494 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:37 -#: amelie/tools/pdf.py:415 +#: amelie/members/forms.py:323 amelie/members/forms.py:402 amelie/members/forms.py:610 amelie/members/templates/includes/registration/authorizations.html:71 amelie/members/templates/includes/registration/data_overview_employee.html:65 amelie/members/templates/includes/registration/data_overview_external.html:65 amelie/members/templates/includes/registration/data_overview_freshmen.html:97 amelie/members/templates/includes/registration/data_overview_general.html:74 amelie/personal_tab/forms.py:119 amelie/personal_tab/models.py:494 amelie/personal_tab/templates/cookie_corner_authorization_view.html:37 amelie/tools/pdf.py:415 msgid "BIC" msgstr "BIC" #: amelie/members/forms.py:354 amelie/members/forms.py:541 -msgid "" -"A study has been chosen, but no cohort was specified. Enter the missing data " -"to continue." -msgstr "" -"Er is wel een studie gekozen, maar geen generatie. Vul een generatie in om " -"verder te gaan" +msgid "A study has been chosen, but no cohort was specified. Enter the missing data to continue." +msgstr "Er is wel een studie gekozen, maar geen generatie. Vul een generatie in om verder te gaan" -#: amelie/members/forms.py:359 amelie/members/forms.py:438 -#: amelie/members/forms.py:650 +#: amelie/members/forms.py:359 amelie/members/forms.py:438 amelie/members/forms.py:650 msgid "IBAN is required if a mandate is checked!" msgstr "IBAN moet ingevuld worden als er een machtiging aangevinkt is!" -#: amelie/members/forms.py:373 amelie/members/forms.py:451 -#: amelie/members/forms.py:555 amelie/members/forms.py:573 +#: amelie/members/forms.py:373 amelie/members/forms.py:451 amelie/members/forms.py:555 amelie/members/forms.py:573 msgid "A student with this student number already exists." msgstr "Student met dit studentnummer bestaat al." -#: amelie/members/forms.py:376 amelie/members/forms.py:453 -#: amelie/members/forms.py:557 amelie/members/forms.py:575 -msgid "" -"This student number is already pre-enrolled. A board member can activate " -"your account." -msgstr "" -"Dit studentnummer is al vooringeschreven. Een bestuurder kan je account " -"activeren." +#: amelie/members/forms.py:376 amelie/members/forms.py:453 amelie/members/forms.py:557 amelie/members/forms.py:575 +msgid "This student number is already pre-enrolled. A board member can activate your account." +msgstr "Dit studentnummer is al vooringeschreven. Een bestuurder kan je account activeren." #: amelie/members/forms.py:513 -msgid "" -"If we can use your parent(s)/guardian(s) data, then you need to enter at " -"least their e-mail address!" -msgstr "" -"Als we de gegevens van je ouder(s)/verzorger(s) mogen gebruiken dan moet je " -"in ieder geval het e-mailadres invullen!" +msgid "If we can use your parent(s)/guardian(s) data, then you need to enter at least their e-mail address!" +msgstr "Als we de gegevens van je ouder(s)/verzorger(s) mogen gebruiken dan moet je in ieder geval het e-mailadres invullen!" #: amelie/members/forms.py:518 -msgid "" -"If we can not use your parent(s)/guardian(s) data, then you do not need to " -"enter any data!" -msgstr "" -"Als we de gegevens van je ouder(s)/verzorger(s) niet mogen gebruiken dan " -"moet je ook geen gegevens invullen!" +msgid "If we can not use your parent(s)/guardian(s) data, then you do not need to enter any data!" +msgstr "Als we de gegevens van je ouder(s)/verzorger(s) niet mogen gebruiken dan moet je ook geen gegevens invullen!" #: amelie/members/forms.py:548 -msgid "" -"A cohort has been chosen, but no study was specified. Enter at least one " -"study to continue." -msgstr "" -"Er is wel een generatie gekozen, maar geen studie. Vul een studie in om " -"verder te gaan" +msgid "A cohort has been chosen, but no study was specified. Enter at least one study to continue." +msgstr "Er is wel een generatie gekozen, maar geen studie. Vul een studie in om verder te gaan" #: amelie/members/forms.py:584 msgid "An employee with this employee number already exists." @@ -6687,30 +4953,15 @@ msgstr "Op studentnummer" msgid "By order of pre-enrollment" msgstr "Op volgorde van voorinschrijving" -#: amelie/members/forms.py:701 amelie/members/models.py:1064 -#: amelie/members/templates/committee_edit_members.html:34 -#: amelie/members/templates/committee_edit_single_member.html:29 -#: amelie/members/templates/committee_members.html:8 -#: amelie/members/templates/includes/person_function_table.html:8 -#: amelie/members/templates/person_edit_functions.html:17 +#: amelie/members/forms.py:701 amelie/members/models.py:1064 amelie/members/templates/committee_edit_members.html:34 amelie/members/templates/committee_edit_single_member.html:29 amelie/members/templates/committee_members.html:8 amelie/members/templates/includes/person_function_table.html:8 amelie/members/templates/person_edit_functions.html:17 msgid "Position" msgstr "Functie" -#: amelie/members/forms.py:737 -#: amelie/members/templates/includes/committee_data.html:20 +#: amelie/members/forms.py:737 amelie/members/templates/includes/committee_data.html:20 msgid "Parent committee" msgstr "Oudercommissie" -#: amelie/members/forms.py:756 amelie/members/models.py:709 -#: amelie/members/models.py:1130 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:74 -#: amelie/members/templates/includes/registration/data_overview_general.html:51 -#: amelie/members/templates/includes/registration/study_freshmen.html:34 -#: amelie/members/templates/includes/registration/study_general.html:34 -#: amelie/members/templates/members/datablock_html.mail:12 -#: amelie/members/templates/members/datablock_plain.mail:11 -#: amelie/members/templates/registration_check.html:38 amelie/tools/pdf.py:141 -#: amelie/tools/pdf.py:146 amelie/tools/pdf.py:408 amelie/tools/pdf.py:411 +#: amelie/members/forms.py:756 amelie/members/models.py:709 amelie/members/models.py:1130 amelie/members/templates/includes/registration/data_overview_freshmen.html:74 amelie/members/templates/includes/registration/data_overview_general.html:51 amelie/members/templates/includes/registration/study_freshmen.html:34 amelie/members/templates/includes/registration/study_general.html:34 amelie/members/templates/members/datablock_html.mail:12 amelie/members/templates/members/datablock_plain.mail:11 amelie/members/templates/registration_check.html:38 amelie/tools/pdf.py:141 amelie/tools/pdf.py:146 amelie/tools/pdf.py:408 amelie/tools/pdf.py:411 msgid "Student number" msgstr "Studentnummer" @@ -6718,8 +4969,31 @@ msgstr "Studentnummer" msgid "There is no student with this student number." msgstr "Student met dit studentnummer bestaat niet." -#: amelie/members/models.py:37 amelie/members/models.py:58 -#: amelie/members/models.py:83 amelie/members/models.py:898 +#: amelie/members/graphql.py:19 +#| msgid "Person" +msgid "Person name" +msgstr "Naam van de persoon" + +#: amelie/members/graphql.py:20 +#| msgid "Person is already a member of this committee." +msgid "This person is currently a member of this committee" +msgstr "Deze persoon zit nu in een commissie" + +#: amelie/members/graphql.py:95 +#| msgid "Members per committee" +msgid "Members of this committee" +msgstr "Leden van deze commissie" + +#: amelie/members/graphql.py:99 +msgid "Committee information (localized for user)" +msgstr "Commissie informatie (aangepast aan de taal van de gebruiker)" + +#: amelie/members/graphql.py:131 +#| msgid "Committees without category" +msgid "Committees in this category" +msgstr "Commissies in deze categorie" + +#: amelie/members/models.py:37 amelie/members/models.py:58 amelie/members/models.py:83 amelie/members/models.py:898 msgid "Abbreviation" msgstr "Afkorting" @@ -6780,12 +5054,8 @@ msgid "Indicates that this study is one of our primary studies" msgstr "Geeft aan dat deze studie een van onze primaire studies is" #: amelie/members/models.py:95 -msgid "" -"Make a study inactive when the study is not given any more on the University " -"of Twente" -msgstr "" -"Maak een studie inactief als de studie niet meer gegeven wordt op de " -"Universiteit Twente" +msgid "Make a study inactive when the study is not given any more on the University of Twente" +msgstr "Maak een studie inactief als de studie niet meer gegeven wordt op de Universiteit Twente" #: amelie/members/models.py:109 msgid "study" @@ -6828,12 +5098,8 @@ msgid "Generation color" msgstr "Generatiekleur" #: amelie/members/models.py:146 -msgid "" -"Similar to the dogroup color, however this value can be set in order to " -"override the color for just this generation" -msgstr "" -"Vergelijkbaar met de kleur van een doegroep, maar als deze is ingevuld " -"overschrijft het de originele doegroep kleurwaarde" +msgid "Similar to the dogroup color, however this value can be set in order to override the color for just this generation" +msgstr "Vergelijkbaar met de kleur van een doegroep, maar als deze is ingevuld overschrijft het de originele doegroep kleurwaarde" #: amelie/members/models.py:150 msgid "do-group generation" @@ -6844,12 +5110,8 @@ msgid "do-group generations" msgstr "doegroepgeneraties" #: amelie/members/models.py:164 -msgid "" -"The mail alias for a dogroup generation may only point to an Inter-Actief " -"server." -msgstr "" -"Het email alias voor een doegroep mag alleen maar verwijzen naar een Inter-" -"Actief server." +msgid "The mail alias for a dogroup generation may only point to an Inter-Actief server." +msgstr "Het email alias voor een doegroep mag alleen maar verwijzen naar een Inter-Actief server." #: amelie/members/models.py:223 msgid "association" @@ -6891,8 +5153,7 @@ msgstr "Instelbaar door gebruiker in profiel" msgid "Adjustable by the user on login" msgstr "Instelbaar door gebruiker bij aanmelding" -#: amelie/members/models.py:255 -#: amelie/room_duty/templates/room_duty/table/overview.html:90 +#: amelie/members/models.py:255 amelie/room_duty/templates/room_duty/table/overview.html:90 msgid "Print" msgstr "Print" @@ -6908,11 +5169,7 @@ msgstr "Man" msgid "Woman" msgstr "Vrouw" -#: amelie/members/models.py:290 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:317 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:48 -#: amelie/personal_tab/templates/lists/transactions_totals.html:24 -#: templates/frontpage.html:119 +#: amelie/members/models.py:290 amelie/personal_tab/templates/cookie_corner_statistics.html:317 amelie/personal_tab/templates/cookie_corner_transactions_new.html:48 amelie/personal_tab/templates/lists/transactions_totals.html:24 templates/frontpage.html:119 msgid "Other" msgstr "Overig" @@ -6926,8 +5183,7 @@ msgstr "Nee, ik ben geen internationale student." #: amelie/members/models.py:295 msgid "I would rather not say if I'm an international student or not." -msgstr "" -"Ik wil liever niet zeggen of ik een internationale student ben of niet." +msgstr "Ik wil liever niet zeggen of ik een internationale student ben of niet." #: amelie/members/models.py:298 msgid "No preference" @@ -6941,115 +5197,63 @@ msgstr "Bash" msgid "Z shell" msgstr "Z shell" -#: amelie/members/models.py:305 amelie/members/models.py:1095 -#: amelie/members/templates/includes/registration/personal_details.html:29 -#: amelie/members/templates/includes/registration/personal_details_employee.html:29 -#: amelie/members/templates/members/datablock_html.mail:3 -#: amelie/members/templates/members/datablock_plain.mail:2 +#: amelie/members/models.py:305 amelie/members/models.py:1095 amelie/members/templates/includes/registration/personal_details.html:29 amelie/members/templates/includes/registration/personal_details_employee.html:29 amelie/members/templates/members/datablock_html.mail:3 amelie/members/templates/members/datablock_plain.mail:2 msgid "Initials" msgstr "Initialen" -#: amelie/members/models.py:307 -#: amelie/members/templates/includes/query/query_results.html:62 +#: amelie/members/models.py:307 amelie/members/templates/includes/query/query_results.html:62 msgid "Photo" msgstr "Foto" -#: amelie/members/models.py:308 -#: amelie/members/templates/includes/query/query_results.html:65 +#: amelie/members/models.py:308 amelie/members/templates/includes/query/query_results.html:65 msgid "Notes" msgstr "Notities" -#: amelie/members/models.py:320 amelie/members/models.py:1104 -#: amelie/members/templates/includes/registration/contact_member.html:24 -#: amelie/members/templates/includes/registration/data_overview_employee.html:28 -#: amelie/members/templates/includes/registration/data_overview_external.html:31 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:31 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:57 -#: amelie/members/templates/includes/registration/data_overview_general.html:31 -#: amelie/members/templates/members/datablock_html.mail:16 -#: amelie/members/templates/members/datablock_plain.mail:15 -#: amelie/tools/pdf.py:398 +#: amelie/members/models.py:320 amelie/members/models.py:1104 amelie/members/templates/includes/registration/contact_member.html:24 amelie/members/templates/includes/registration/data_overview_employee.html:28 amelie/members/templates/includes/registration/data_overview_external.html:31 amelie/members/templates/includes/registration/data_overview_freshmen.html:31 amelie/members/templates/includes/registration/data_overview_freshmen.html:57 amelie/members/templates/includes/registration/data_overview_general.html:31 amelie/members/templates/members/datablock_html.mail:16 amelie/members/templates/members/datablock_plain.mail:15 amelie/tools/pdf.py:398 msgid "Postal code" msgstr "Postcode" -#: amelie/members/models.py:321 amelie/members/models.py:1105 -#: amelie/members/templates/includes/registration/contact_member.html:37 -#: amelie/members/templates/includes/registration/data_overview_employee.html:31 -#: amelie/members/templates/includes/registration/data_overview_external.html:34 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:34 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:60 -#: amelie/members/templates/includes/registration/data_overview_general.html:34 -#: amelie/members/templates/members/datablock_html.mail:17 -#: amelie/members/templates/members/datablock_plain.mail:16 -#: amelie/personal_tab/templates/exports/screen.html:68 amelie/tools/pdf.py:112 -#: amelie/tools/pdf.py:400 +#: amelie/members/models.py:321 amelie/members/models.py:1105 amelie/members/templates/includes/registration/contact_member.html:37 amelie/members/templates/includes/registration/data_overview_employee.html:31 amelie/members/templates/includes/registration/data_overview_external.html:34 amelie/members/templates/includes/registration/data_overview_freshmen.html:34 amelie/members/templates/includes/registration/data_overview_freshmen.html:60 amelie/members/templates/includes/registration/data_overview_general.html:34 amelie/members/templates/members/datablock_html.mail:17 amelie/members/templates/members/datablock_plain.mail:16 amelie/personal_tab/templates/exports/screen.html:68 amelie/tools/pdf.py:112 amelie/tools/pdf.py:400 msgid "City" msgstr "Plaats" -#: amelie/members/models.py:322 amelie/members/models.py:1106 -#: amelie/members/templates/includes/registration/contact_member.html:50 -#: amelie/members/templates/includes/registration/data_overview_employee.html:34 -#: amelie/members/templates/includes/registration/data_overview_external.html:37 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:37 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:63 -#: amelie/members/templates/includes/registration/data_overview_general.html:37 -#: amelie/members/templates/members/datablock_html.mail:18 -#: amelie/members/templates/members/datablock_plain.mail:17 -#: amelie/tools/pdf.py:114 amelie/tools/pdf.py:402 +#: amelie/members/models.py:322 amelie/members/models.py:1106 amelie/members/templates/includes/registration/contact_member.html:50 amelie/members/templates/includes/registration/data_overview_employee.html:34 amelie/members/templates/includes/registration/data_overview_external.html:37 amelie/members/templates/includes/registration/data_overview_freshmen.html:37 amelie/members/templates/includes/registration/data_overview_freshmen.html:63 amelie/members/templates/includes/registration/data_overview_general.html:37 amelie/members/templates/members/datablock_html.mail:18 amelie/members/templates/members/datablock_plain.mail:17 amelie/tools/pdf.py:114 amelie/tools/pdf.py:402 msgid "Country" msgstr "Land" -#: amelie/members/models.py:323 amelie/members/models.py:1107 -#: amelie/members/query_forms.py:35 -#: amelie/members/templates/members/datablock_html.mail:20 -#: amelie/members/templates/members/datablock_plain.mail:19 -#: amelie/tools/pdf.py:120 +#: amelie/members/models.py:323 amelie/members/models.py:1107 amelie/members/query_forms.py:35 amelie/members/templates/members/datablock_html.mail:20 amelie/members/templates/members/datablock_plain.mail:19 amelie/tools/pdf.py:120 msgid "Phonenumber" msgstr "Telefoonnummer" -#: amelie/members/models.py:325 amelie/members/models.py:1109 -#: amelie/members/templates/includes/person_data_table.html:109 -#: amelie/members/templates/includes/registration/contact_parents.html:25 +#: amelie/members/models.py:325 amelie/members/models.py:1109 amelie/members/templates/includes/person_data_table.html:109 amelie/members/templates/includes/registration/contact_parents.html:25 msgid "E-mail address of parent(s)/guardian(s)" msgstr "E-mailadres van ouder(s)/verzorger(s)" -#: amelie/members/models.py:326 amelie/members/models.py:1110 -#: amelie/members/templates/includes/person_data_table.html:92 -#: amelie/members/templates/includes/registration/contact_parents.html:38 -#: amelie/tools/pdf.py:126 templates/profile_edit.html:57 +#: amelie/members/models.py:326 amelie/members/models.py:1110 amelie/members/templates/includes/person_data_table.html:92 amelie/members/templates/includes/registration/contact_parents.html:38 amelie/tools/pdf.py:126 templates/profile_edit.html:57 msgid "Address of parent(s)/guardian(s)" msgstr "Adres van ouder(s)/verzorger(s)" -#: amelie/members/models.py:328 amelie/members/models.py:1112 -#: amelie/members/templates/includes/registration/contact_parents.html:51 +#: amelie/members/models.py:328 amelie/members/models.py:1112 amelie/members/templates/includes/registration/contact_parents.html:51 msgid "Postal code of parent(s)/guardian(s)" msgstr "Postcode van ouder(s)/verzorger(s)" -#: amelie/members/models.py:330 amelie/members/models.py:1114 -#: amelie/members/templates/includes/registration/contact_parents.html:64 -#: amelie/tools/pdf.py:128 +#: amelie/members/models.py:330 amelie/members/models.py:1114 amelie/members/templates/includes/registration/contact_parents.html:64 amelie/tools/pdf.py:128 msgid "Residence of parent(s)/guardian(s)" msgstr "Woonplaats van ouder(s)/verzorger(s)" -#: amelie/members/models.py:332 amelie/members/models.py:1116 -#: amelie/members/templates/includes/registration/contact_parents.html:77 -#: amelie/tools/pdf.py:130 +#: amelie/members/models.py:332 amelie/members/models.py:1116 amelie/members/templates/includes/registration/contact_parents.html:77 amelie/tools/pdf.py:130 msgid "Country of parent(s)/guardian(s)" msgstr "Land van ouder(s)/verzorger(s)" -#: amelie/members/models.py:333 amelie/members/models.py:1117 -#: amelie/members/templates/includes/registration/contact_parents.html:16 -#: templates/profile_edit.html:64 +#: amelie/members/models.py:333 amelie/members/models.py:1117 amelie/members/templates/includes/registration/contact_parents.html:16 templates/profile_edit.html:64 msgid "My parents' address details may be used for the parents day." -msgstr "" -"De adresgegevens van mijn ouders mogen gebruikt worden voor de ouderdag." +msgstr "De adresgegevens van mijn ouders mogen gebruikt worden voor de ouderdag." #: amelie/members/models.py:337 msgid "You can only enter ^[a-z]*$." msgstr "Je mag alleen ^[a-z]*$ invullen." -#: amelie/members/models.py:337 amelie/members/models.py:343 -#: amelie/members/models.py:899 +#: amelie/members/models.py:337 amelie/members/models.py:343 amelie/members/models.py:899 msgid "Invalid account name" msgstr "Ongeldige accountnaam" @@ -7086,8 +5290,7 @@ msgstr "Wachtwoordherstelcode" msgid "Password reset code expiry" msgstr "Verloopdatum wachtwoordherstelcode" -#: amelie/members/models.py:363 amelie/personal_tab/models.py:83 -#: amelie/personal_tab/models.py:488 +#: amelie/members/models.py:363 amelie/personal_tab/models.py:83 amelie/personal_tab/models.py:488 msgid "person" msgstr "persoon" @@ -7096,14 +5299,8 @@ msgid "people" msgstr "personen" #: amelie/members/models.py:651 -msgid "" -"Your email address is not to point to an Inter-Actief server. If you have a " -"Google Apps account please use firstname.lastname@gapps.inter-actief.nl as " -"an alternative." -msgstr "" -"Je E-mailadres mag niet naar een Inter-Actief server verwijzen. Als je een " -"Google Apps account hebt kan je voornaam.achternaam@gapps.inter-actief.nl " -"gebruiken." +msgid "Your email address is not to point to an Inter-Actief server. If you have a Google Apps account please use firstname.lastname@gapps.inter-actief.nl as an alternative." +msgstr "Je E-mailadres mag niet naar een Inter-Actief server verwijzen. Als je een Google Apps account hebt kan je voornaam.achternaam@gapps.inter-actief.nl gebruiken." #: amelie/members/models.py:664 msgid "Needs verification" @@ -7137,15 +5334,11 @@ msgstr "studenten" msgid "Student" msgstr "Student" -#: amelie/members/models.py:739 -#: amelie/room_duty/templates/room_duty/table/fill.html:19 -#: amelie/room_duty/templates/room_duty/table/overview.html:100 +#: amelie/members/models.py:739 amelie/room_duty/templates/room_duty/table/fill.html:19 amelie/room_duty/templates/room_duty/table/overview.html:100 msgid "Begin" msgstr "Begin" -#: amelie/members/models.py:740 amelie/members/models.py:762 -#: amelie/room_duty/templates/room_duty/table/fill.html:20 -#: amelie/room_duty/templates/room_duty/table/overview.html:101 +#: amelie/members/models.py:740 amelie/members/models.py:762 amelie/room_duty/templates/room_duty/table/fill.html:20 amelie/room_duty/templates/room_duty/table/overview.html:101 msgid "End" msgstr "Eind" @@ -7161,10 +5354,7 @@ msgstr "studieperiode" msgid "study periods" msgstr "studieperiodes" -#: amelie/members/models.py:760 -#: amelie/members/templates/includes/registration/data_overview_employee.html:45 -#: amelie/members/templates/includes/registration/employee_general.html:10 -#: amelie/tools/pdf.py:136 amelie/tools/pdf.py:406 +#: amelie/members/models.py:760 amelie/members/templates/includes/registration/data_overview_employee.html:45 amelie/members/templates/includes/registration/employee_general.html:10 amelie/tools/pdf.py:136 amelie/tools/pdf.py:406 msgid "Employee number" msgstr "Medewerkernummer" @@ -7178,8 +5368,7 @@ msgstr "medewerkers" #: amelie/members/models.py:799 msgid "External photographers should at least have a first- and lastname." -msgstr "" -"Een externe fotograaf moet op zijn minst een voor- en achternaam hebben." +msgstr "Een externe fotograaf moet op zijn minst een voor- en achternaam hebben." #: amelie/members/models.py:820 msgid "Member" @@ -7201,11 +5390,7 @@ msgstr "lidmaatschap" msgid "memberships" msgstr "lidmaatschappen" -#: amelie/members/models.py:859 -#: amelie/members/templates/includes/query/query_membership.html:3 -#: amelie/personal_tab/models.py:240 amelie/tools/pdf.py:68 -#: amelie/tools/pdf.py:150 templates/basis.html:164 -#: templates/profile_overview.html:42 +#: amelie/members/models.py:859 amelie/members/templates/includes/query/query_membership.html:3 amelie/personal_tab/models.py:240 amelie/tools/pdf.py:68 amelie/tools/pdf.py:150 templates/basis.html:164 templates/profile_overview.html:42 msgid "Membership" msgstr "Lidmaatschap" @@ -7241,8 +5426,7 @@ msgstr "Begonnen op" msgid "Ended on" msgstr "Gestopt op" -#: amelie/members/models.py:912 -#: amelie/members/templates/includes/committee_data.html:36 +#: amelie/members/models.py:912 amelie/members/templates/includes/committee_data.html:36 msgid "Web site" msgstr "Website" @@ -7263,8 +5447,7 @@ msgid "Is board" msgstr "Is bestuur" #: amelie/members/models.py:922 -msgid "" -"Members of this committee are granted board authorities on this web site" +msgid "Members of this committee are granted board authorities on this web site" msgstr "Leden van deze commissie krijgen bestuursrecht op de website" #: amelie/members/models.py:924 @@ -7275,8 +5458,7 @@ msgstr "Gitlab groep aanmaken" msgid "Members of this committee get access to GitLab" msgstr "Leden van deze commissie krijgen toegang tot GitLab" -#: amelie/members/models.py:933 amelie/personal_tab/models.py:25 -#: amelie/personal_tab/models.py:255 +#: amelie/members/models.py:933 amelie/personal_tab/models.py:25 amelie/personal_tab/models.py:255 msgid "ledger account" msgstr "grootboekrekeningnummer" @@ -7289,17 +5471,10 @@ msgid "committees" msgstr "commissies" #: amelie/members/models.py:947 -msgid "" -"The email address for a committee may only point to an Inter-Actief server." -msgstr "" -"Het e-mailadres van een commissie mag alleen maar verwijzen naar een Inter-" -"Actief server." - -#: amelie/members/models.py:1063 -#: amelie/members/templates/includes/person_function_table.html:7 -#: amelie/members/templates/person_edit_functions.html:16 -#: amelie/members/templates/statistics/overview.html:105 -#: amelie/statistics/templates/statistics.html:39 +msgid "The email address for a committee may only point to an Inter-Actief server." +msgstr "Het e-mailadres van een commissie mag alleen maar verwijzen naar een Inter-Actief server." + +#: amelie/members/models.py:1063 amelie/members/templates/includes/person_function_table.html:7 amelie/members/templates/person_edit_functions.html:16 amelie/members/templates/statistics/overview.html:105 amelie/statistics/templates/statistics.html:39 msgid "Committee" msgstr "Commissie" @@ -7420,32 +5595,20 @@ msgid "Mandate number" msgstr "Machtiging-nummer" #: amelie/members/query_forms.py:89 -msgid "" -"Students in their second year or higher, including all masters (primary " -"studies)" -msgstr "" -"Tweedejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" +msgid "Students in their second year or higher, including all masters (primary studies)" +msgstr "Tweedejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" #: amelie/members/query_forms.py:91 -msgid "" -"Students in their third year or higher, including all masters (primary " -"studies)" -msgstr "" -"Derdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" +msgid "Students in their third year or higher, including all masters (primary studies)" +msgstr "Derdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" #: amelie/members/query_forms.py:93 -msgid "" -"Students in their fourth year or higher, including all masters (primary " -"studies)" -msgstr "" -"Vierdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" +msgid "Students in their fourth year or higher, including all masters (primary studies)" +msgstr "Vierdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" #: amelie/members/query_forms.py:95 -msgid "" -"Students in their fifth year or higher, including all masters (primary " -"studies)" -msgstr "" -"Vijfdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" +msgid "Students in their fifth year or higher, including all masters (primary studies)" +msgstr "Vijfdejaarsstudenten en hoger, inclusief alle masters (alleen hoofdstudies)" #: amelie/members/query_forms.py:110 msgid "Invalid student or employee number." @@ -7496,30 +5659,16 @@ msgid "Invalid template" msgstr "Ongeldig template" #: amelie/members/query_views.py:153 amelie/personal_tab/views.py:1687 -msgid "" -"The mails are now being sent one by one. This happens in a background " -"process and might take a while." -msgstr "" -"De mails worden nu een voor een verstuurd. Dit gebeurt in een " -"achtergrondproces en kan even duren." +msgid "The mails are now being sent one by one. This happens in a background process and might take a while." +msgstr "De mails worden nu een voor een verstuurd. Dit gebeurt in een achtergrondproces en kan even duren." #: amelie/members/query_views.py:195 -msgid "" -"The push notifications are now being sent one by one. This happens in a " -"background process and might take a while. You will get a delivery report " -"via e-mail when it is complete." -msgstr "" -"De push notificaties worden nu verstuurd. Dit gebeurt in een " -"achtergrondproces en kan even duren.Je krijgt straks een afleverrapport via " -"e-mail." +msgid "The push notifications are now being sent one by one. This happens in a background process and might take a while. You will get a delivery report via e-mail when it is complete." +msgstr "De push notificaties worden nu verstuurd. Dit gebeurt in een achtergrondproces en kan even duren.Je krijgt straks een afleverrapport via e-mail." #: amelie/members/query_views.py:226 -msgid "" -"Could not make a data export, because an unknown data export type was " -"selected." -msgstr "" -"Kon geen data-export maken, omdat er een onbekend data-exporttype is " -"opegeven." +msgid "Could not make a data export, because an unknown data export type was selected." +msgstr "Kon geen data-export maken, omdat er een onbekend data-exporttype is opegeven." #: amelie/members/templates/birthday_mail.mail:3 msgid "[Inter-Actief] Happy Birthday!" @@ -7531,12 +5680,9 @@ msgid "" "Dear %(first_name)s,\n" "\n" "The board of Inter-Actief congratulates you with your %(age)s birthday!\n" -"If you find yourself near Inter-Actief today, please come by the Inter-" -"Actief room so we can congratulate you in person.\n" +"If you find yourself near Inter-Actief today, please come by the Inter-Actief room so we can congratulate you in person.\n" "\n" -"Also if you would like to get a nice present, when you come to out next " -"afternoon drink and show you had your birthday you will receive a large " -"glass filled with beer or soda, free of charge!\n" +"Also if you would like to get a nice present, when you come to out next afternoon drink and show you had your birthday you will receive a large glass filled with beer or soda, free of charge!\n" "\n" "We wish you a very happy day!\n" "\n" @@ -7545,23 +5691,17 @@ msgid "" msgstr "" "Beste %(first_name)s,\n" "\n" -"Namens het bestuur van Inter-Actief, van harte gefeliciteerd met je %(age)s " -"verjaardag!\n" -"Mocht je toevallig in de buurt van Inter-Actief komen vandaag, kom dan even " -"langs, we feliciteren je namelijk ook nog graag persoonlijk.\n" +"Namens het bestuur van Inter-Actief, van harte gefeliciteerd met je %(age)s verjaardag!\n" +"Mocht je toevallig in de buurt van Inter-Actief komen vandaag, kom dan even langs, we feliciteren je namelijk ook nog graag persoonlijk.\n" "\n" -"Kom vooral naar de volgende borrel voor een leuk presentje. Wanneer je laat " -"zien dat je jarig bent geweest, krijg je een gigantisch glas gevuld met bier " -"of fris, helemaal gratis!\n" +"Kom vooral naar de volgende borrel voor een leuk presentje. Wanneer je laat zien dat je jarig bent geweest, krijg je een gigantisch glas gevuld met bier of fris, helemaal gratis!\n" "\n" "We wensen je in ieder geval een hele fijne dag toe!\n" "\n" "Met vriendelijke groet,\n" "Het bestuur van Inter-Actief" -#: amelie/members/templates/birthdays.html:5 -#: amelie/members/templates/birthdays.html:12 templates/frontpage.html:174 -#: templates/frontpage.html:176 +#: amelie/members/templates/birthdays.html:5 amelie/members/templates/birthdays.html:12 templates/frontpage.html:174 templates/frontpage.html:176 msgid "Birthdays" msgstr "Verjaardagen" @@ -7569,9 +5709,7 @@ msgstr "Verjaardagen" msgid "year" msgstr "jaar" -#: amelie/members/templates/birthdays.html:27 -#: amelie/members/templates/includes/person_data_table.html:25 -#: templates/frontpage.html:187 +#: amelie/members/templates/birthdays.html:27 amelie/members/templates/includes/person_data_table.html:25 templates/frontpage.html:187 msgid "years" msgstr "jaren" @@ -7579,19 +5717,13 @@ msgstr "jaren" msgid "There are no birthdays today" msgstr "Er zijn geen jarigen vandaag." -#: amelie/members/templates/books_list.html:4 -#: amelie/members/templates/books_list.html:8 +#: amelie/members/templates/books_list.html:4 amelie/members/templates/books_list.html:8 msgid "Booklist" msgstr "Boekenlijst" #: amelie/members/templates/books_list.html:11 -msgid "" -"This is the book list for IAPC. The first list contains al students of BIT " -"and MBI, the second on all other students who are a member of Inter-" -"Actief." -msgstr "" -"Dit zijn de boekenlijsten voor IAPC. De eerste lijst bevat alle student BIT " -"en MBI, de tweede lijst alle andere studenten die bij ons lid zijn." +msgid "This is the book list for IAPC. The first list contains al students of BIT and MBI, the second on all other students who are a member of Inter-Actief." +msgstr "Dit zijn de boekenlijsten voor IAPC. De eerste lijst bevat alle student BIT en MBI, de tweede lijst alle andere studenten die bij ons lid zijn." #: amelie/members/templates/books_list.html:16 msgid "BIT-students" @@ -7601,13 +5733,11 @@ msgstr "BIT-studenten" msgid "Other students" msgstr "Andere studenten" -#: amelie/members/templates/committee.html:35 -#: amelie/members/templates/committee_edit_members.html:16 +#: amelie/members/templates/committee.html:35 amelie/members/templates/committee_edit_members.html:16 msgid "Edit members" msgstr "Wijzig leden" -#: amelie/members/templates/committee.html:64 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:42 +#: amelie/members/templates/committee.html:64 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:42 msgid "Agenda" msgstr "Agenda" @@ -7626,62 +5756,32 @@ msgstr "Oud-lid-historie" #: amelie/members/templates/committee.html:104 msgid "" "\n" -" This overview contains all functions. It may " -"therefore occur that people show up in the\n" -" overview multiple times. People from parent-" -"committees have also been added to this\n" +" This overview contains all functions. It may therefore occur that people show up in the\n" +" overview multiple times. People from parent-committees have also been added to this\n" " overview.\n" " " msgstr "" "\n" -"In dit overzicht staan alle functies. Het kan daarom zijn dat personen " -"meerdere\n" -"malen in het overzicht voorkomen. Ook zijn personen van ouder-commissies in " -"dit\n" +"In dit overzicht staan alle functies. Het kan daarom zijn dat personen meerdere\n" +"malen in het overzicht voorkomen. Ook zijn personen van ouder-commissies in dit\n" "overzicht opgenomen." #: amelie/members/templates/committee_edit_members.html:19 msgid "" "\n" -" This page is only for editing currently active committee " -"members, and for adding new members.
    \n" -" To edit old members, use the  icon next to the member in the old members table on the " -"committee page.\n" +" This page is only for editing currently active committee members, and for adding new members.
    \n" +" To edit old members, use the  icon next to the member in the old members table on the committee page.\n" " " msgstr "" "\n" -"Deze pagina is alleen voor het aanpassen van huidige commissieleden, en voor " -"het toevoegen van nieuwe leden.
    \n" -"Om oud-leden aan te passen, gebruik je het -icoontje naast het lid in de oud-ledentabel op de commissiepagina." - -#: amelie/members/templates/committee_edit_members.html:35 -#: amelie/members/templates/committee_edit_single_member.html:30 -#: amelie/members/templates/includes/person_function_table.html:9 -#: amelie/members/templates/person_edit_functions.html:18 -#: amelie/members/templates/person_edit_study.html:13 -#: amelie/members/templates/person_mandate.html:23 -#: amelie/personal_tab/forms.py:120 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:70 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:45 -#: amelie/personal_tab/templates/info/account_information.html:16 -#: amelie/personal_tab/templates/lists/authorization_select.html:13 -#: amelie/statistics/models.py:6 +"Deze pagina is alleen voor het aanpassen van huidige commissieleden, en voor het toevoegen van nieuwe leden.
    \n" +"Om oud-leden aan te passen, gebruik je het -icoontje naast het lid in de oud-ledentabel op de commissiepagina." + +#: amelie/members/templates/committee_edit_members.html:35 amelie/members/templates/committee_edit_single_member.html:30 amelie/members/templates/includes/person_function_table.html:9 amelie/members/templates/person_edit_functions.html:18 amelie/members/templates/person_edit_study.html:13 amelie/members/templates/person_mandate.html:23 amelie/personal_tab/forms.py:120 amelie/personal_tab/templates/cookie_corner_authorization_list.html:70 amelie/personal_tab/templates/cookie_corner_authorization_view.html:45 amelie/personal_tab/templates/info/account_information.html:16 amelie/personal_tab/templates/lists/authorization_select.html:13 amelie/statistics/models.py:6 msgid "Starts on" msgstr "Begindatum" -#: amelie/members/templates/committee_edit_members.html:36 -#: amelie/members/templates/committee_edit_single_member.html:31 -#: amelie/members/templates/includes/person_function_table.html:10 -#: amelie/members/templates/person_edit_functions.html:19 -#: amelie/members/templates/person_edit_study.html:14 -#: amelie/members/templates/person_mandate.html:24 -#: amelie/personal_tab/forms.py:121 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:71 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:49 -#: amelie/personal_tab/templates/info/account_information.html:17 -#: amelie/statistics/models.py:7 +#: amelie/members/templates/committee_edit_members.html:36 amelie/members/templates/committee_edit_single_member.html:31 amelie/members/templates/includes/person_function_table.html:10 amelie/members/templates/person_edit_functions.html:19 amelie/members/templates/person_edit_study.html:14 amelie/members/templates/person_mandate.html:24 amelie/personal_tab/forms.py:121 amelie/personal_tab/templates/cookie_corner_authorization_list.html:71 amelie/personal_tab/templates/cookie_corner_authorization_view.html:49 amelie/personal_tab/templates/info/account_information.html:17 amelie/statistics/models.py:7 msgid "Ends on" msgstr "Einddatum" @@ -7689,16 +5789,11 @@ msgstr "Einddatum" msgid "Edit committee member" msgstr "Wijzig commissielid" -#: amelie/members/templates/committee_form.html:6 -#: amelie/members/templates/committee_form.html:17 -#: amelie/members/templates/committee_form.html:52 -#: amelie/members/templates/committees.html:32 +#: amelie/members/templates/committee_form.html:6 amelie/members/templates/committee_form.html:17 amelie/members/templates/committee_form.html:52 amelie/members/templates/committees.html:32 msgid "Add committee" msgstr "Commissie toevoegen" -#: amelie/members/templates/committee_form.html:8 -#: amelie/members/templates/committee_form.html:19 -#: amelie/members/templates/committee_form.html:52 +#: amelie/members/templates/committee_form.html:8 amelie/members/templates/committee_form.html:19 amelie/members/templates/committee_form.html:52 msgid "Change committee" msgstr "Commissie wijzigen" @@ -7714,46 +5809,35 @@ msgstr "Voeg lid toe" msgid "Member since" msgstr "Lid sinds" -#: amelie/members/templates/committees.html:5 -#: amelie/members/templates/committees.html:11 -#: amelie/members/templates/person.html:53 -#: amelie/members/templates/statistics/overview.html:72 -#: templates/basis.html:163 templates/profile_overview.html:141 +#: amelie/members/templates/committees.html:5 amelie/members/templates/committees.html:11 amelie/members/templates/person.html:53 amelie/members/templates/statistics/overview.html:72 templates/basis.html:163 templates/profile_overview.html:141 msgid "Committees" msgstr "Commissies" #: amelie/members/templates/committees.html:15 msgid "" "\n" -" Inter-Actief has a large number of " -"committees which organize events.\n" +" Inter-Actief has a large number of committees which organize events.\n" " Every committee belongs to a specific category.\n" " " msgstr "" "\n" -"Inter-Actief kent een groot aantal commissies die activiteiten " -"organiseren. Elke commissie behoort tot een bepaalde categorie." +"Inter-Actief kent een groot aantal commissies die activiteiten organiseren. Elke commissie behoort tot een bepaalde categorie." #: amelie/members/templates/committees.html:20 #, python-format msgid "" "\n" -" For an overview of all committees, including " -"inactive committees, see our\n" -" committee booklet.\n" +" For an overview of all committees, including inactive committees, see our\n" +" committee booklet.\n" " " msgstr "" "\n" -"Voor een overzicht van alle commissies van Inter-Actief, inclusief " -"nog te vormen commissies, zie ons commissieboekje." +"Voor een overzicht van alle commissies van Inter-Actief, inclusief nog te vormen commissies, zie ons commissieboekje." #: amelie/members/templates/committees.html:25 msgid "" "\n" -" At the moment Inter-Actief has the " -"following committees:\n" +" At the moment Inter-Actief has the following committees:\n" " " msgstr "" "\n" @@ -7775,29 +5859,21 @@ msgstr "Opgeheven commissies" msgid "There are no committees which have been disbanded." msgstr "Er zijn geen commissies opgeheven" -#: amelie/members/templates/dogroups.html:5 -#: amelie/members/templates/dogroups.html:24 templates/basis.html:203 +#: amelie/members/templates/dogroups.html:5 amelie/members/templates/dogroups.html:24 templates/basis.html:203 msgid "Dogroups" msgstr "Doegroepen" #: amelie/members/templates/dogroups.html:28 msgid "" "\n" -" During the introductory period of the university, the " -"Kick-In, Inter-Actief has study\n" -" related do-groups that accompany new students into their " -"student life. These groups usually exist\n" -" for many generations and are closely intertwined. On " -"this page one can find a complete overview of\n" +" During the introductory period of the university, the Kick-In, Inter-Actief has study\n" +" related do-groups that accompany new students into their student life. These groups usually exist\n" +" for many generations and are closely intertwined. On this page one can find a complete overview of\n" " these groups and their origins.\n" " " msgstr "" "\n" -"Gedurende de introductie periode van de universiteit, de Kick-In, Inter-" -"Actief heeft studiegerelateerde doegroepen die nieuwe studenten " -"begeleiden in hun studenten leven. Deze doegroepen bestaan vaak al voor " -"meerdere generaties en zijn met elkaar verweven. Op deze pagina vind je een " -"compleet overzicht van deze groepen en hun oorsprong." +"Gedurende de introductie periode van de universiteit, de Kick-In, Inter-Actief heeft studiegerelateerde doegroepen die nieuwe studenten begeleiden in hun studenten leven. Deze doegroepen bestaan vaak al voor meerdere generaties en zijn met elkaar verweven. Op deze pagina vind je een compleet overzicht van deze groepen en hun oorsprong." #: amelie/members/templates/dogroups.html:38 msgid "Hold tight while the dogroup family tree is being loaded" @@ -7825,11 +5901,7 @@ msgstr "" "\n" "%(obj)s heeft geen pasfoto." -#: amelie/members/templates/includes/person_data_table.html:20 -#: amelie/members/templates/includes/registration/data_overview_employee.html:5 -#: amelie/members/templates/includes/registration/data_overview_external.html:5 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:5 -#: amelie/members/templates/includes/registration/data_overview_general.html:5 +#: amelie/members/templates/includes/person_data_table.html:20 amelie/members/templates/includes/registration/data_overview_employee.html:5 amelie/members/templates/includes/registration/data_overview_external.html:5 amelie/members/templates/includes/registration/data_overview_freshmen.html:5 amelie/members/templates/includes/registration/data_overview_general.html:5 msgid "Full name" msgstr "Volledige naam" @@ -7837,35 +5909,24 @@ msgstr "Volledige naam" msgid "Claudia link" msgstr "Claudia-link" -#: amelie/members/templates/includes/person_data_table.html:47 -#: amelie/members/templates/includes/query/query_person_data.html:23 +#: amelie/members/templates/includes/person_data_table.html:47 amelie/members/templates/includes/query/query_person_data.html:23 msgid "No account" msgstr "Geen account" -#: amelie/members/templates/includes/person_data_table.html:78 -#: amelie/members/templates/includes/registration/contact_member.html:63 -#: amelie/members/templates/includes/registration/data_overview_employee.html:37 -#: amelie/members/templates/includes/registration/data_overview_external.html:40 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:40 -#: amelie/members/templates/includes/registration/data_overview_general.html:40 +#: amelie/members/templates/includes/person_data_table.html:78 amelie/members/templates/includes/registration/contact_member.html:63 amelie/members/templates/includes/registration/data_overview_employee.html:37 amelie/members/templates/includes/registration/data_overview_external.html:40 amelie/members/templates/includes/registration/data_overview_freshmen.html:40 amelie/members/templates/includes/registration/data_overview_general.html:40 msgid "(Mobile) telephone number" msgstr "(Mobiel) Telefoonnummer" -#: amelie/members/templates/includes/person_data_table.html:119 -#: amelie/members/templates/registration_check.html:80 -#: amelie/personal_tab/templates/cookie_corner_overview.html:4 -#: amelie/personal_tab/templates/cookie_corner_overview.html:8 +#: amelie/members/templates/includes/person_data_table.html:119 amelie/members/templates/registration_check.html:80 amelie/personal_tab/templates/cookie_corner_overview.html:4 amelie/personal_tab/templates/cookie_corner_overview.html:8 msgid "Digital cookie and candy list" msgstr "Digitale streeplijst" -#: amelie/members/templates/includes/person_data_table.html:130 -#: amelie/members/templates/includes/query/query_person_data.html:48 +#: amelie/members/templates/includes/person_data_table.html:130 amelie/members/templates/includes/query/query_person_data.html:48 #, python-format msgid "%(first_name)s is a member" msgstr "%(first_name)s is lid." -#: amelie/members/templates/includes/person_data_table.html:135 -#: amelie/members/templates/includes/query/query_person_data.html:51 +#: amelie/members/templates/includes/person_data_table.html:135 amelie/members/templates/includes/query/query_person_data.html:51 #, python-format msgid "%(first_name)s is not a member" msgstr "%(first_name)s is niet lid." @@ -7875,20 +5936,17 @@ msgstr "%(first_name)s is niet lid." msgid "%(first_name)s is (not) a member (anymore)" msgstr "%(first_name)s is (nog) geen lid (meer)." -#: amelie/members/templates/includes/person_data_table.html:143 -#: amelie/members/templates/includes/query/query_person_data.html:58 +#: amelie/members/templates/includes/person_data_table.html:143 amelie/members/templates/includes/query/query_person_data.html:58 #, python-format msgid "%(first_name)s is active" msgstr "%(first_name)s is actief." -#: amelie/members/templates/includes/person_data_table.html:146 -#: amelie/members/templates/includes/query/query_person_data.html:61 +#: amelie/members/templates/includes/person_data_table.html:146 amelie/members/templates/includes/query/query_person_data.html:61 #, python-format msgid "%(first_name)s is not active" msgstr "%(first_name)s is niet actief." -#: amelie/members/templates/includes/person_data_table.html:148 -#: amelie/members/templates/includes/query/query_person_data.html:63 +#: amelie/members/templates/includes/person_data_table.html:148 amelie/members/templates/includes/query/query_person_data.html:63 #, python-format msgid "%(first_name)s is not active any more" msgstr "%(first_name)s is niet meer actief." @@ -7907,13 +5965,11 @@ msgstr "%(first_name)s is webmaster." msgid "No further notes" msgstr "Geen verdere notities." -#: amelie/members/templates/includes/person_data_table.html:174 -#: amelie/members/templates/includes/query/query_results.html:52 +#: amelie/members/templates/includes/person_data_table.html:174 amelie/members/templates/includes/query/query_results.html:52 msgid "Send a mailing" msgstr "Stuur een mailing" -#: amelie/members/templates/includes/person_data_table.html:180 -#: amelie/members/templates/includes/query/query_results.html:53 +#: amelie/members/templates/includes/person_data_table.html:180 amelie/members/templates/includes/query/query_results.html:53 msgid "Send a push notification" msgstr "Stuur een push notificatie" @@ -7929,9 +5985,7 @@ msgstr "Activisme" msgid "Employee" msgstr "Medewerker" -#: amelie/members/templates/includes/query/query_mailing.html:36 -#: amelie/members/templates/includes/query/query_mailing.html:142 -#: amelie/twitter/templates/twitter_new_tweet.html:11 +#: amelie/members/templates/includes/query/query_mailing.html:36 amelie/members/templates/includes/query/query_mailing.html:142 amelie/twitter/templates/twitter_new_tweet.html:11 msgid "Example" msgstr "Voorbeeld" @@ -7944,9 +5998,7 @@ msgstr "" "\n" "Controleer je bericht goed voordat je deze daadwerkelijk verzend." -#: amelie/members/templates/includes/query/query_mailing.html:50 -#: amelie/members/templates/includes/query/query_mailing.html:54 -#: amelie/members/templates/includes/query/query_mailing.html:106 +#: amelie/members/templates/includes/query/query_mailing.html:50 amelie/members/templates/includes/query/query_mailing.html:54 amelie/members/templates/includes/query/query_mailing.html:106 msgid "Subject:" msgstr "Onderwerp:" @@ -7954,22 +6006,18 @@ msgstr "Onderwerp:" #, python-format msgid "" "\n" -" There are %(amount)s persons selected. The variable " -"'recipient' contains data of every\n" +" There are %(amount)s persons selected. The variable 'recipient' contains data of every\n" " receiver. They can be used as follows:\n" " " msgstr "" "\n" -"Er zijn %(amount)s personen geselecteerd. De variabele 'recipient' bevat de " -"gegevens van iedere ontvanger. Deze is als volgt te gebruiken:" +"Er zijn %(amount)s personen geselecteerd. De variabele 'recipient' bevat de gegevens van iedere ontvanger. Deze is als volgt te gebruiken:" -#: amelie/members/templates/includes/query/query_mailing.html:98 -#: amelie/members/templates/includes/query/query_mailing.html:122 +#: amelie/members/templates/includes/query/query_mailing.html:98 amelie/members/templates/includes/query/query_mailing.html:122 msgid "NL:" msgstr "NL:" -#: amelie/members/templates/includes/query/query_mailing.html:101 -#: amelie/members/templates/includes/query/query_mailing.html:125 +#: amelie/members/templates/includes/query/query_mailing.html:101 amelie/members/templates/includes/query/query_mailing.html:125 msgid "EN:" msgstr "EN:" @@ -7994,36 +6042,29 @@ msgstr "%(first_name)s is geen lid meer." msgid "Pre-programmed selections" msgstr "Voorgeprogrammeerde selecties" -#: amelie/members/templates/includes/query/query_push.html:5 -#: amelie/members/templates/includes/query/query_push.html:11 +#: amelie/members/templates/includes/query/query_push.html:5 amelie/members/templates/includes/query/query_push.html:11 msgid "Send push notification" msgstr "Push notificatie versturen" #: amelie/members/templates/includes/query/query_push.html:16 msgid "" "\n" -" From the people that you have selected, there is " -"no person with a registered push device.\n" +" From the people that you have selected, there is no person with a registered push device.\n" " " msgstr "" "\n" -"Van alle geselecteerde personen is er geen persoon met een geregistreerd " -"push apparaat." +"Van alle geselecteerde personen is er geen persoon met een geregistreerd push apparaat." #: amelie/members/templates/includes/query/query_push.html:30 #, python-format msgid "" "\n" -" You can only send a push notification to a " -"maximum of %(count)s people based on\n" -" your selection. Use the fields below to compose " -"a message.\n" +" You can only send a push notification to a maximum of %(count)s people based on\n" +" your selection. Use the fields below to compose a message.\n" " " msgstr "" "\n" -"Er kan naar maximaal %(count)s personen een push notificatie worden " -"gestuurd op basis van jouw selectie. Gebruik de velden hieronder om een " -"bericht op te stellen." +"Er kan naar maximaal %(count)s personen een push notificatie worden gestuurd op basis van jouw selectie. Gebruik de velden hieronder om een bericht op te stellen." #: amelie/members/templates/includes/query/query_push.html:111 msgid "Send notification" @@ -8053,8 +6094,7 @@ msgstr "Resultaten" msgid "Add new freshmen" msgstr "Nieuwe eerstejaars toevoegen" -#: amelie/members/templates/includes/query/query_results.html:55 -#: templates/frontpage.html:111 +#: amelie/members/templates/includes/query/query_results.html:55 templates/frontpage.html:111 msgid "Add new member" msgstr "Nieuw lid toevoegen" @@ -8066,14 +6106,7 @@ msgstr "Persoonsgegevens" msgid "Contact data" msgstr "Contactgegevens" -#: amelie/members/templates/includes/registration/authorizations.html:4 -#: amelie/members/templates/person.html:26 -#: amelie/members/templates/registration_check.html:73 -#: amelie/personal_tab/forms.py:148 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:4 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:58 -#: amelie/personal_tab/templates/cookie_corner_overview.html:21 -#: amelie/personal_tab/templates/info/account_information.html:4 +#: amelie/members/templates/includes/registration/authorizations.html:4 amelie/members/templates/person.html:26 amelie/members/templates/registration_check.html:73 amelie/personal_tab/forms.py:148 amelie/personal_tab/templates/cookie_corner_authorization_list.html:4 amelie/personal_tab/templates/cookie_corner_authorization_list.html:58 amelie/personal_tab/templates/cookie_corner_overview.html:21 amelie/personal_tab/templates/info/account_information.html:4 msgid "Mandates" msgstr "Machtigingen" @@ -8082,114 +6115,52 @@ msgid "You have to pay your membership fee via a direct debit authorization." msgstr "Je moet je lidmaatschap betalen via een automatische machtiging." #: amelie/members/templates/includes/registration/authorizations.html:10 -msgid "" -"If you chose the yearly membership above, then you authorize the association " -"to withdraw the membership fee from your bank account automatically in the " -"coming years. Your membership will be extended automatically each your until " -"terminate it." -msgstr "" -"Indien je hierboven voor een jaarlidmaatschap hebt gekozen, dan machtig je " -"de vereniging om in de komende jaren elk jaar het lidmaatschapsgeld van je " -"rekening af te laten schrijven. Je lidmaatschap wordt dan elk jaar (totdat " -"je het opzegt) automatisch verlengd." +msgid "If you chose the yearly membership above, then you authorize the association to withdraw the membership fee from your bank account automatically in the coming years. Your membership will be extended automatically each your until terminate it." +msgstr "Indien je hierboven voor een jaarlidmaatschap hebt gekozen, dan machtig je de vereniging om in de komende jaren elk jaar het lidmaatschapsgeld van je rekening af te laten schrijven. Je lidmaatschap wordt dan elk jaar (totdat je het opzegt) automatisch verlengd." #: amelie/members/templates/includes/registration/authorizations.html:13 -msgid "" -"If you have chosen for a study long membership, then the authorization will " -"only be used once." -msgstr "" -"Indien je hebt gekozen voor een studielang lidmaatschap, dan wordt de " -"machtiging slechts een keer gebruikt." +msgid "If you have chosen for a study long membership, then the authorization will only be used once." +msgstr "Indien je hebt gekozen voor een studielang lidmaatschap, dan wordt de machtiging slechts een keer gebruikt." #: amelie/members/templates/includes/registration/authorizations.html:21 -msgid "" -"I authorize the association to withdraw my membership fee from my bank " -"account. " -msgstr "" -"Ik machtig de vereniging om de kosten van het lidmaatschap van mijn rekening " -"af te schrijven." +msgid "I authorize the association to withdraw my membership fee from my bank account. " +msgstr "Ik machtig de vereniging om de kosten van het lidmaatschap van mijn rekening af te schrijven." #: amelie/members/templates/includes/registration/authorizations.html:22 -msgid "" -"If you do not give permission, then you need to pay your membership fee in " -"cash." -msgstr "" -"Als je geen toestemming geeft, dan moet je je lidmaatschapsgeld contant " -"betalen." +msgid "If you do not give permission, then you need to pay your membership fee in cash." +msgstr "Als je geen toestemming geeft, dan moet je je lidmaatschapsgeld contant betalen." #: amelie/members/templates/includes/registration/authorizations.html:28 -msgid "" -"At Inter-Actief you can participate in activities; pay for " -"consumptions during the activities; or pay for cookies, drinks and candy at " -"the cookie corner in the Inter-Actief room." -msgstr "" -"Bij Inter-Actief kun je deelnemen aan activiteiten; consumpties " -"betalen op de activiteiten, of koekjes, drinken en snoep strepen op een " -"streeplijst in de Inter-Actief-kamer." +msgid "At Inter-Actief you can participate in activities; pay for consumptions during the activities; or pay for cookies, drinks and candy at the cookie corner in the Inter-Actief room." +msgstr "Bij Inter-Actief kun je deelnemen aan activiteiten; consumpties betalen op de activiteiten, of koekjes, drinken en snoep strepen op een streeplijst in de Inter-Actief-kamer." #: amelie/members/templates/includes/registration/authorizations.html:31 -msgid "" -"The costs for these activities and consumptions can be paid with a direct " -"debit authorization. The amount will then be withdrawn from your bank " -"account monthly." -msgstr "" -"De kosten voor deze activiteiten en consumpties kun je betalen via een " -"machtiging. Het bedrag wordt dan maandelijks van je rekening geï" -"ncasseerd." +msgid "The costs for these activities and consumptions can be paid with a direct debit authorization. The amount will then be withdrawn from your bank account monthly." +msgstr "De kosten voor deze activiteiten en consumpties kun je betalen via een machtiging. Het bedrag wordt dan maandelijks van je rekening geïncasseerd." #: amelie/members/templates/includes/registration/authorizations.html:39 -msgid "" -"I authorize the association to debit my bank account for consumptions and " -"activities." -msgstr "" -"Ik machtig de vereniging geld af te schrijven voor consumpties en " -"activiteiten." +msgid "I authorize the association to debit my bank account for consumptions and activities." +msgstr "Ik machtig de vereniging geld af te schrijven voor consumpties en activiteiten." #: amelie/members/templates/includes/registration/authorizations.html:40 -msgid "" -"If you do not give permission, then you have to pay in cash during " -"activities, and you will not be able to use the cookie corner in the Inter-" -"Actief room or the personal tab during drinks and activities." -msgstr "" -"Als je geen toestemming geeft, dan moet je op activiteiten contant betalen " -"en kan je niet strepen op de streeplijst in de Inter-Actief-kamer of bij " -"borrels en activiteiten." +msgid "If you do not give permission, then you have to pay in cash during activities, and you will not be able to use the cookie corner in the Inter-Actief room or the personal tab during drinks and activities." +msgstr "Als je geen toestemming geeft, dan moet je op activiteiten contant betalen en kan je niet strepen op de streeplijst in de Inter-Actief-kamer of bij borrels en activiteiten." #: amelie/members/templates/includes/registration/authorizations.html:46 -msgid "" -"If you choose not to sign an authorization, you will need to pay your " -"contribution fee in cash. This can only be done in person at the Inter-" -"Actief room. Your membership will not be activated until the payment " -"has been completed." -msgstr "" -"Als je ervoor kiest om geen machtiging te tekenen, dan moet je je " -"contributie contant betalen. Dit kan alleen persoonlijk in de Inter-" -"Actief-kamer. Je lidmaatschap zal niet actief worden totdat de " -"betaling is afgerond." +msgid "If you choose not to sign an authorization, you will need to pay your contribution fee in cash. This can only be done in person at the Inter-Actief room. Your membership will not be activated until the payment has been completed." +msgstr "Als je ervoor kiest om geen machtiging te tekenen, dan moet je je contributie contant betalen. Dit kan alleen persoonlijk in de Inter-Actief-kamer. Je lidmaatschap zal niet actief worden totdat de betaling is afgerond." #: amelie/members/templates/includes/registration/authorizations.html:52 -msgid "" -"If you did choose an authorization above, then we need your bank details." -msgstr "" -"Als je hierboven wel een machtiging hebt afgesloten, dan hebben we je " -"bankgegevens nodig." +msgid "If you did choose an authorization above, then we need your bank details." +msgstr "Als je hierboven wel een machtiging hebt afgesloten, dan hebben we je bankgegevens nodig." #: amelie/members/templates/includes/registration/authorizations.html:63 -msgid "" -"Your IBAN bank account number. For example \"NL18ABNA0484869868\"." -msgstr "" -"Je IBAN-bankrekeningnummer. Bijvoorbeeld \"NL18ABNA0484869868\"." +msgid "Your IBAN bank account number. For example \"NL18ABNA0484869868\"." +msgstr "Je IBAN-bankrekeningnummer. Bijvoorbeeld \"NL18ABNA0484869868\"." #: amelie/members/templates/includes/registration/authorizations.html:76 -msgid "" -"Your BIC-code. Not required for Dutch bank accounts. For example " -"\"ABNANL2A\". Find your BIC by clicking here (opens in new tab)." -msgstr "" -"Je BIC-code. Niet vereist voor Nederlandse rekeningnummers. " -"Bijvoorbeeld \"ABNANL2A\". Vind je BIC door hier te klikken (opent " -"in nieuwe tab)." +msgid "Your BIC-code. Not required for Dutch bank accounts. For example \"ABNANL2A\". Find your BIC by clicking here (opens in new tab)." +msgstr "Je BIC-code. Niet vereist voor Nederlandse rekeningnummers. Bijvoorbeeld \"ABNANL2A\". Vind je BIC door hier te klikken (opent in nieuwe tab)." #: amelie/members/templates/includes/registration/contact_member.html:6 msgid "Where can we reach you?" @@ -8208,21 +6179,14 @@ msgid "The city you live in." msgstr "Je woonplaats." #: amelie/members/templates/includes/registration/contact_member.html:55 -msgid "" -"The name of the country you live in. (For example \"The Netherlands\")" -msgstr "" -"De naam van het land waar je woont. (Bijvoorbeeld \"Nederland\")" +msgid "The name of the country you live in. (For example \"The Netherlands\")" +msgstr "De naam van het land waar je woont. (Bijvoorbeeld \"Nederland\")" #: amelie/members/templates/includes/registration/contact_member.html:68 msgid "Your (preferably mobile) telephone number." msgstr "Je (liefst mobiele) telefoonnummer." -#: amelie/members/templates/includes/registration/contact_member.html:68 -#: amelie/members/templates/includes/registration/contact_parents.html:30 -#: amelie/members/templates/includes/registration/contact_parents.html:43 -#: amelie/members/templates/includes/registration/contact_parents.html:56 -#: amelie/members/templates/includes/registration/contact_parents.html:69 -#: amelie/members/templates/includes/registration/contact_parents.html:82 +#: amelie/members/templates/includes/registration/contact_member.html:68 amelie/members/templates/includes/registration/contact_parents.html:30 amelie/members/templates/includes/registration/contact_parents.html:43 amelie/members/templates/includes/registration/contact_parents.html:56 amelie/members/templates/includes/registration/contact_parents.html:69 amelie/members/templates/includes/registration/contact_parents.html:82 msgid "Optional." msgstr "Niet verplicht." @@ -8231,24 +6195,12 @@ msgid "Where can we reach your parent(s)/guardian(s)?" msgstr "Waar kunnen we je ouder(s)/verzorger(s) bereiken?" #: amelie/members/templates/includes/registration/contact_parents.html:7 -msgid "" -"Inter-Actief organises a parents day each year for the parent(s)/" -"guardian(s) of our first years. To invite your parent(s)/guardian(s) for " -"this day, we need their contact details (at least an e-mail address), as " -"well as permission to use those details for this purpose." -msgstr "" -"Inter-Actief organiseert elk jaar een ouderdag voor de ouder(s)/" -"verzorger(s) van onze eerstejaars. Om je ouder(s)/verzorger(s) hiervoor uit " -"te kunnen nodigen hebben we hun contactgegevens nodig (ten minste een e-" -"mailadres), en ook toestemming nodig om die gegevens hiervoor te gebruiken." +msgid "Inter-Actief organises a parents day each year for the parent(s)/guardian(s) of our first years. To invite your parent(s)/guardian(s) for this day, we need their contact details (at least an e-mail address), as well as permission to use those details for this purpose." +msgstr "Inter-Actief organiseert elk jaar een ouderdag voor de ouder(s)/verzorger(s) van onze eerstejaars. Om je ouder(s)/verzorger(s) hiervoor uit te kunnen nodigen hebben we hun contactgegevens nodig (ten minste een e-mailadres), en ook toestemming nodig om die gegevens hiervoor te gebruiken." #: amelie/members/templates/includes/registration/contact_parents.html:17 -msgid "" -"If you do not give permission, then you do not need to fill in the fields " -"below." -msgstr "" -"Als je geen toestemming geeft, dan hoef je de velden hieronder niet in te " -"vullen." +msgid "If you do not give permission, then you do not need to fill in the fields below." +msgstr "Als je geen toestemming geeft, dan hoef je de velden hieronder niet in te vullen." #: amelie/members/templates/includes/registration/contact_parents.html:30 msgid "The e-mail address of your parent(s)/guardian(s)" @@ -8260,32 +6212,21 @@ msgstr "Straat en huisnummer van je ouder(s)/verzorger(s)." #: amelie/members/templates/includes/registration/contact_parents.html:56 msgid "Postal code of parent(s)/guardian(s), in the format \"1234 AB\"." -msgstr "" -"Postcode van je ouder(s)/verzorger(s), in het formaat \"1234 AB\"." +msgstr "Postcode van je ouder(s)/verzorger(s), in het formaat \"1234 AB\"." #: amelie/members/templates/includes/registration/contact_parents.html:69 msgid "City of parent(s)/guardian(s)" msgstr "Woonplaats van je ouder(s)/verzorger(s)." #: amelie/members/templates/includes/registration/contact_parents.html:82 -msgid "" -"The name of the country of your parent(s)/guardian(s). For example \"The " -"Netherlands\"" -msgstr "" -"De naam van het land van je ouder(s)/verzorger(s). Bijvoorbeeld " -"\"Nederland\"" +msgid "The name of the country of your parent(s)/guardian(s). For example \"The Netherlands\"" +msgstr "De naam van het land van je ouder(s)/verzorger(s). Bijvoorbeeld \"Nederland\"" -#: amelie/members/templates/includes/registration/data_overview_employee.html:3 -#: amelie/members/templates/includes/registration/data_overview_external.html:3 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:3 -#: amelie/members/templates/includes/registration/data_overview_general.html:3 +#: amelie/members/templates/includes/registration/data_overview_employee.html:3 amelie/members/templates/includes/registration/data_overview_external.html:3 amelie/members/templates/includes/registration/data_overview_freshmen.html:3 amelie/members/templates/includes/registration/data_overview_general.html:3 msgid "Personal details" msgstr "Persoonlijke gegevens" -#: amelie/members/templates/includes/registration/data_overview_employee.html:23 -#: amelie/members/templates/includes/registration/data_overview_external.html:26 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:26 -#: amelie/members/templates/includes/registration/data_overview_general.html:26 +#: amelie/members/templates/includes/registration/data_overview_employee.html:23 amelie/members/templates/includes/registration/data_overview_external.html:26 amelie/members/templates/includes/registration/data_overview_freshmen.html:26 amelie/members/templates/includes/registration/data_overview_general.html:26 msgid "Own address details" msgstr "Eigen adresgegevens" @@ -8293,58 +6234,31 @@ msgstr "Eigen adresgegevens" msgid "Employee and Membership data" msgstr "Medewerker- en Lidmaatschapsgegevens" -#: amelie/members/templates/includes/registration/data_overview_employee.html:48 -#: amelie/members/templates/includes/registration/data_overview_external.html:48 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:80 -#: amelie/members/templates/includes/registration/data_overview_general.html:57 -#: amelie/members/templates/includes/registration/membership_employee.html:20 -#: amelie/members/templates/includes/registration/membership_freshmen.html:25 -#: amelie/members/templates/includes/registration/membership_general.html:33 -#: amelie/members/templates/registration_check.html:59 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:289 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:10 +#: amelie/members/templates/includes/registration/data_overview_employee.html:48 amelie/members/templates/includes/registration/data_overview_external.html:48 amelie/members/templates/includes/registration/data_overview_freshmen.html:80 amelie/members/templates/includes/registration/data_overview_general.html:57 amelie/members/templates/includes/registration/membership_employee.html:20 amelie/members/templates/includes/registration/membership_freshmen.html:25 amelie/members/templates/includes/registration/membership_general.html:33 amelie/members/templates/registration_check.html:59 amelie/personal_tab/templates/cookie_corner_statistics.html:289 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:10 msgid "Membership type" msgstr "Lidmaatschapstype" -#: amelie/members/templates/includes/registration/data_overview_employee.html:54 -#: amelie/members/templates/includes/registration/data_overview_external.html:54 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:86 -#: amelie/members/templates/includes/registration/data_overview_general.html:63 +#: amelie/members/templates/includes/registration/data_overview_employee.html:54 amelie/members/templates/includes/registration/data_overview_external.html:54 amelie/members/templates/includes/registration/data_overview_freshmen.html:86 amelie/members/templates/includes/registration/data_overview_general.html:63 msgid "Direct debit authorization details" msgstr "Machtigingsgegevens" -#: amelie/members/templates/includes/registration/data_overview_employee.html:56 -#: amelie/members/templates/includes/registration/data_overview_external.html:56 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:88 -#: amelie/members/templates/includes/registration/data_overview_general.html:65 +#: amelie/members/templates/includes/registration/data_overview_employee.html:56 amelie/members/templates/includes/registration/data_overview_external.html:56 amelie/members/templates/includes/registration/data_overview_freshmen.html:88 amelie/members/templates/includes/registration/data_overview_general.html:65 msgid "I want a contribution authorization" msgstr "Ik wil een contributiemachtiging" -#: amelie/members/templates/includes/registration/data_overview_employee.html:59 -#: amelie/members/templates/includes/registration/data_overview_external.html:59 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:91 -#: amelie/members/templates/includes/registration/data_overview_general.html:68 -msgid "" -"I want to have an authorization for activities, consumptions and other " -"transactions" -msgstr "" -"Ik wil een machtiging voor activiteiten, consumpties en overige transacties" +#: amelie/members/templates/includes/registration/data_overview_employee.html:59 amelie/members/templates/includes/registration/data_overview_external.html:59 amelie/members/templates/includes/registration/data_overview_freshmen.html:91 amelie/members/templates/includes/registration/data_overview_general.html:68 +msgid "I want to have an authorization for activities, consumptions and other transactions" +msgstr "Ik wil een machtiging voor activiteiten, consumpties en overige transacties" -#: amelie/members/templates/includes/registration/data_overview_employee.html:71 -#: amelie/members/templates/includes/registration/data_overview_external.html:71 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:103 -#: amelie/members/templates/includes/registration/data_overview_general.html:80 +#: amelie/members/templates/includes/registration/data_overview_employee.html:71 amelie/members/templates/includes/registration/data_overview_external.html:71 amelie/members/templates/includes/registration/data_overview_freshmen.html:103 amelie/members/templates/includes/registration/data_overview_general.html:80 msgid "Personal preferences" msgstr "Persoonlijke voorkeuren" -#: amelie/members/templates/includes/registration/data_overview_external.html:20 -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:20 -#: amelie/members/templates/includes/registration/data_overview_general.html:20 +#: amelie/members/templates/includes/registration/data_overview_external.html:20 amelie/members/templates/includes/registration/data_overview_freshmen.html:20 amelie/members/templates/includes/registration/data_overview_general.html:20 msgid "International student?" msgstr "Internationale student?" -#: amelie/members/templates/includes/registration/data_overview_external.html:46 -#: amelie/members/templates/person.html:17 +#: amelie/members/templates/includes/registration/data_overview_external.html:46 amelie/members/templates/person.html:17 msgid "Membership data" msgstr "Lidmaatschapsgegevens" @@ -8360,17 +6274,11 @@ msgstr "Adresgegevens ouder(s)/verzorger(s)" msgid "My parents' details may be used for the parents day" msgstr "Oudergegevens mogen gebruikt worden voor de ouderdag" -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:69 -#: amelie/members/templates/includes/registration/data_overview_general.html:46 +#: amelie/members/templates/includes/registration/data_overview_freshmen.html:69 amelie/members/templates/includes/registration/data_overview_general.html:46 msgid "Study and Membership data" msgstr "Studie- en Lidmaatschapsgegevens" -#: amelie/members/templates/includes/registration/data_overview_freshmen.html:71 -#: amelie/members/templates/includes/registration/data_overview_general.html:48 -#: amelie/members/templates/includes/registration/study_freshmen.html:10 -#: amelie/members/templates/includes/registration/study_general.html:10 -#: amelie/members/templates/person_study.html:9 -#: templates/profile_overview.html:108 +#: amelie/members/templates/includes/registration/data_overview_freshmen.html:71 amelie/members/templates/includes/registration/data_overview_general.html:48 amelie/members/templates/includes/registration/study_freshmen.html:10 amelie/members/templates/includes/registration/study_general.html:10 amelie/members/templates/person_study.html:9 templates/profile_overview.html:108 msgid "Study/studies" msgstr "Studie(s)" @@ -8391,11 +6299,8 @@ msgid "That's it!" msgstr "Dat was het..." #: amelie/members/templates/includes/registration/final_check.html:7 -msgid "" -"That was it. Please check your personal details again and then continue." -msgstr "" -"Dat was het. Controleer hieronder je gegevens alsjeblieft nog een keer en ga " -"dan verder." +msgid "That was it. Please check your personal details again and then continue." +msgstr "Dat was het. Controleer hieronder je gegevens alsjeblieft nog een keer en ga dan verder." #: amelie/members/templates/includes/registration/final_check.html:24 msgid "Is everything OK?" @@ -8407,66 +6312,31 @@ msgstr "Ik ben klaar met invullen." #: amelie/members/templates/includes/registration/final_check.html:32 msgid "All information I filled in is correct and has been checked again." -msgstr "" -"Alle informatie die ik heb ingevuld klopt en is nogmaals gecontroleerd." +msgstr "Alle informatie die ik heb ingevuld klopt en is nogmaals gecontroleerd." #: amelie/members/templates/includes/registration/final_check.html:42 msgid "Permission for processing of personal details" msgstr "Toestemming verwerking persoonlijke gegevens" #: amelie/members/templates/includes/registration/final_check.html:45 -msgid "" -"According to Dutch law, we have to explicitly ask you for permission to " -"process your personal details. By checking the box below, you give us " -"permission to save and use your personal details for the purposes listed in " -"our privacy " -"document." -msgstr "" -"Van de Nederlandse wet moeten we je expliciet toestemming vragen om je " -"persoonlijke gegevens te mogen verwerken. Door het onderstaande vinkje aan " -"te klikken geef je ons toestemming om jouw persoonlijke gegevens op te slaan " -"en te gebruiken voor de doeleinden die genoemd worden in onze privacyverklaring." +msgid "According to Dutch law, we have to explicitly ask you for permission to process your personal details. By checking the box below, you give us permission to save and use your personal details for the purposes listed in our privacy document." +msgstr "Van de Nederlandse wet moeten we je expliciet toestemming vragen om je persoonlijke gegevens te mogen verwerken. Door het onderstaande vinkje aan te klikken geef je ons toestemming om jouw persoonlijke gegevens op te slaan en te gebruiken voor de doeleinden die genoemd worden in onze privacyverklaring." #: amelie/members/templates/includes/registration/final_check.html:49 -msgid "" -"According to Dutch law, we cannot process personal details of people under " -"16 years old, unless their parent(s)/guardian(s) have given permission for " -"it. Are you younger then 16 years old, please ask your parent(s)/guardian(s) " -"if they give permission that Inter-Actief can process your personal " -"details." -msgstr "" -"Van de Nederlandse wet mogen we geen gegevens verwerken van mensen die " -"jonger zijn dan 16 jaar, tenzij de ouder(s)/verzorger(s) hiervoor " -"toestemming hebben gegeven. Ben je jonger dan 16 jaar, vraag dan je ouder(s)/" -"verzorger(s) eerst om toestemming dat Inter-Actief je persoonlijke " -"gegevens mag verwerken." +msgid "According to Dutch law, we cannot process personal details of people under 16 years old, unless their parent(s)/guardian(s) have given permission for it. Are you younger then 16 years old, please ask your parent(s)/guardian(s) if they give permission that Inter-Actief can process your personal details." +msgstr "Van de Nederlandse wet mogen we geen gegevens verwerken van mensen die jonger zijn dan 16 jaar, tenzij de ouder(s)/verzorger(s) hiervoor toestemming hebben gegeven. Ben je jonger dan 16 jaar, vraag dan je ouder(s)/verzorger(s) eerst om toestemming dat Inter-Actief je persoonlijke gegevens mag verwerken." #: amelie/members/templates/includes/registration/final_check.html:57 -msgid "" -"I am 16 years old or older, and I give permission, or my parent(s)/" -"guardian(s) give permission, that my personal details may be processed by " -"Inter-Actief." -msgstr "" -"Ik ben 16 jaar of ouder en ik geef toestemming, of mijn ouder(s)/" -"verzorger(s) geven toestemming, dat mijn persoonlijke gegevens worden " -"verwerkt door Inter-Actief." +msgid "I am 16 years old or older, and I give permission, or my parent(s)/guardian(s) give permission, that my personal details may be processed by Inter-Actief." +msgstr "Ik ben 16 jaar of ouder en ik geef toestemming, of mijn ouder(s)/verzorger(s) geven toestemming, dat mijn persoonlijke gegevens worden verwerkt door Inter-Actief." #: amelie/members/templates/includes/registration/final_check.html:58 -msgid "" -"If you are under 16 years old, you have to actually ask for " -"permission, do not just check the box!" -msgstr "" -"Als je onder de 16 bent moet je je ouders daadwerkelijk vragen om " -"toestemming, niet gewoon het vinkje aan zetten!" +msgid "If you are under 16 years old, you have to actually ask for permission, do not just check the box!" +msgstr "Als je onder de 16 bent moet je je ouders daadwerkelijk vragen om toestemming, niet gewoon het vinkje aan zetten!" #: amelie/members/templates/includes/registration/final_check.html:64 -msgid "" -"After you send the form one or more PDF-documents will appear that you need " -"to print out and sign." -msgstr "" -"Na het versturen zullen er een of meerdere PDF-documenten verschijnen die je " -"moet uitprinten en ondertekenen." +msgid "After you send the form one or more PDF-documents will appear that you need to print out and sign." +msgstr "Na het versturen zullen er een of meerdere PDF-documenten verschijnen die je moet uitprinten en ondertekenen." #: amelie/members/templates/includes/registration/introduction.html:7 msgid "Pre-enroll at Inter-Actief" @@ -8477,37 +6347,23 @@ msgid "Enroll at Inter-Actief" msgstr "Inschrijven bij Inter-Actief" #: amelie/members/templates/includes/registration/introduction.html:13 -msgid "" -"Welcome to Inter-Actief! To register you as a member of the " -"association, we would like to know a couple of things about you." -msgstr "" -"Welkom bij Inter-Actief! Om je in te schrijven als lid van de " -"vereniging, willen wij graag wat dingen van je weten." +msgid "Welcome to Inter-Actief! To register you as a member of the association, we would like to know a couple of things about you." +msgstr "Welkom bij Inter-Actief! Om je in te schrijven als lid van de vereniging, willen wij graag wat dingen van je weten." #: amelie/members/templates/includes/registration/introduction.html:16 -msgid "" -"Please try to fill in the form as correctly as possible (with correct " -"capitalization / formatting), this saves the board a lot of work." -msgstr "" -"Probeer alsjeblieft het formulier zo correct mogelijk (correct " -"hoofdlettergebruik / format) in te vullen, dat scheelt het bestuur veel werk." +msgid "Please try to fill in the form as correctly as possible (with correct capitalization / formatting), this saves the board a lot of work." +msgstr "Probeer alsjeblieft het formulier zo correct mogelijk (correct hoofdlettergebruik / format) in te vullen, dat scheelt het bestuur veel werk." #: amelie/members/templates/includes/registration/introduction.html:19 -msgid "" -"Fields marked with a * are required, " -"the rest is optional." -msgstr "" -"Velden gemarkeerd met een * zijn " -"verplicht, de rest is optioneel." +msgid "Fields marked with a * are required, the rest is optional." +msgstr "Velden gemarkeerd met een * zijn verplicht, de rest is optioneel." #: amelie/members/templates/includes/registration/introduction.html:26 #, python-format msgid "Step %(current_step)s of %(total_steps)s" msgstr "Stap %(current_step)s van %(total_steps)s" -#: amelie/members/templates/includes/registration/membership_employee.html:4 -#: amelie/members/templates/includes/registration/membership_freshmen.html:4 -#: amelie/members/templates/includes/registration/membership_general.html:4 +#: amelie/members/templates/includes/registration/membership_employee.html:4 amelie/members/templates/includes/registration/membership_freshmen.html:4 amelie/members/templates/includes/registration/membership_general.html:4 msgid "What membership type do you want?" msgstr "Wat voor lidmaatschap wil je?" @@ -8519,25 +6375,16 @@ msgstr "Als medewerker is er maar één soort lidmaatschap mogelijk." #, python-format msgid "" "\n" -" With a year membership for employees, you pay every " -"year, and you will be a member until you\n" -" yourself cancel your membership. This membership is " -"meant for employees of the University of Twente\n" -" who want to become a member. A year membership for " -"employees costs €\n" +" With a year membership for employees, you pay every year, and you will be a member until you\n" +" yourself cancel your membership. This membership is meant for employees of the University of Twente\n" +" who want to become a member. A year membership for employees costs €\n" " %(employee_member_costs)s yearly.\n" " " msgstr "" "\n" -"Met een jaarlidmaatschap voor medewerkers betaal je elk jaar, en blijf je " -"lid totdat je zelf je lidmaatschap opzegt. Dit lidmaatschap is bedoeld voor " -"medewerkers van de Universiteit Twente die lid willen worden. Een " -"jaarlidmaatschap voor medewerkers kost jaarlijks € " -"%(employee_member_costs)s." +"Met een jaarlidmaatschap voor medewerkers betaal je elk jaar, en blijf je lid totdat je zelf je lidmaatschap opzegt. Dit lidmaatschap is bedoeld voor medewerkers van de Universiteit Twente die lid willen worden. Een jaarlidmaatschap voor medewerkers kost jaarlijks € %(employee_member_costs)s." -#: amelie/members/templates/includes/registration/membership_employee.html:25 -#: amelie/members/templates/includes/registration/membership_freshmen.html:30 -#: amelie/members/templates/includes/registration/membership_general.html:38 +#: amelie/members/templates/includes/registration/membership_employee.html:25 amelie/members/templates/includes/registration/membership_freshmen.html:30 amelie/members/templates/includes/registration/membership_general.html:38 msgid "Which membership type do you want? (See above for explanations)" msgstr "Welk lidmaatschapstype wil je? (Zie hierboven voor uitleg)" @@ -8549,35 +6396,24 @@ msgstr "Je kan kiezen uit twee soorten lidmaatschap." #, python-format msgid "" "\n" -" With a study long membership, you pay once, and will be " -"a member as long as you are studying\n" -" Technical Computer Science (TCS), Business Information " -"Technology (BIT) or one of their associated masters.\n" -" A study long membership costs € " -"%(study_long_member_costs)s once.\n" +" With a study long membership, you pay once, and will be a member as long as you are studying\n" +" Technical Computer Science (TCS), Business Information Technology (BIT) or one of their associated masters.\n" +" A study long membership costs € %(study_long_member_costs)s once.\n" " " msgstr "" "\n" -"Met een studielang lidmaatschap betaal je één keer, en blijf je lid zolang " -"je Technische Informatica (TCS), Business Information Technology (BIT) of " -"een van de bijbehorende masters studeert. Een studielang lidmaatschap kost " -"eenmalig € %(study_long_member_costs)s." +"Met een studielang lidmaatschap betaal je één keer, en blijf je lid zolang je Technische Informatica (TCS), Business Information Technology (BIT) of een van de bijbehorende masters studeert. Een studielang lidmaatschap kost eenmalig € %(study_long_member_costs)s." -#: amelie/members/templates/includes/registration/membership_freshmen.html:15 -#: amelie/members/templates/includes/registration/membership_general.html:15 +#: amelie/members/templates/includes/registration/membership_freshmen.html:15 amelie/members/templates/includes/registration/membership_general.html:15 #, python-format msgid "" "\n" -" With a primary year membership, you pay every year, and " -"you will be a member until you yourself\n" -" cancel your membership. A primary year membership costs " -"€ %(year_member_costs)s yearly.\n" +" With a primary year membership, you pay every year, and you will be a member until you yourself\n" +" cancel your membership. A primary year membership costs € %(year_member_costs)s yearly.\n" " " msgstr "" "\n" -"Met een primair jaarlidmaatschap betaal je elk jaar, en blijf je lid totdat " -"je zelf je lidmaatschap opzegt. Een primair jaarlidmaatschap kost jaarlijks " -"€ %(year_member_costs)s." +"Met een primair jaarlidmaatschap betaal je elk jaar, en blijf je lid totdat je zelf je lidmaatschap opzegt. Een primair jaarlidmaatschap kost jaarlijks € %(year_member_costs)s." #: amelie/members/templates/includes/registration/membership_general.html:6 msgid "You can choose between three types of membership." @@ -8587,102 +6423,58 @@ msgstr "Je kan kiezen uit drie soorten lidmaatschap." #, python-format msgid "" "\n" -" With a study long membership, you pay once, and will be " -"a member as long as you are studying\n" -" Technical Computer Science (TCS) or Business Information " -"Technology (BIT). A study long membership costs €\n" +" With a study long membership, you pay once, and will be a member as long as you are studying\n" +" Technical Computer Science (TCS) or Business Information Technology (BIT). A study long membership costs €\n" " %(study_long_member_costs)s once.\n" " " msgstr "" "\n" -"Met een studielang lidmaatschap betaal je één keer, en blijf je lid zolang " -"je Technische Informatica (TCS) of Business Information Technology (BIT) " -"studeert. Een studielang lidmaatschap kost eenmalig € " -"%(study_long_member_costs)s." +"Met een studielang lidmaatschap betaal je één keer, en blijf je lid zolang je Technische Informatica (TCS) of Business Information Technology (BIT) studeert. Een studielang lidmaatschap kost eenmalig € %(study_long_member_costs)s." #: amelie/members/templates/includes/registration/membership_general.html:21 #, python-format msgid "" "\n" -" With a secondary year membership, you pay every year, " -"and you will be a member until you yourself\n" -" cancel your membership. This membership is meant for " -"people who are already a member of a different\n" -" study association, who also want to become a member of " -"Inter-Actief. A secondary year\n" -" membership costs € %(secondary_member_costs)s " -"yearly.\n" +" With a secondary year membership, you pay every year, and you will be a member until you yourself\n" +" cancel your membership. This membership is meant for people who are already a member of a different\n" +" study association, who also want to become a member of Inter-Actief. A secondary year\n" +" membership costs € %(secondary_member_costs)s yearly.\n" " " msgstr "" "\n" -"Met een secundair jaarlidmaatschap betaal je elk jaar, en blijf je lid " -"totdat je zelf je lidmaatschap opzegt. Dit lidmaatschap is bedoeld voor " -"mensen die al lid zijn bij een andere studievereniging en ook lid willen " -"worden van Inter-Actief. Een secundair jaarlidmaatschap kost " -"jaarlijks € %(secondary_member_costs)s." +"Met een secundair jaarlidmaatschap betaal je elk jaar, en blijf je lid totdat je zelf je lidmaatschap opzegt. Dit lidmaatschap is bedoeld voor mensen die al lid zijn bij een andere studievereniging en ook lid willen worden van Inter-Actief. Een secundair jaarlidmaatschap kost jaarlijks € %(secondary_member_costs)s." -#: amelie/members/templates/includes/registration/personal_details.html:6 -#: amelie/members/templates/includes/registration/personal_details_employee.html:6 +#: amelie/members/templates/includes/registration/personal_details.html:6 amelie/members/templates/includes/registration/personal_details_employee.html:6 msgid "Who are you?" msgstr "Wie ben je?" -#: amelie/members/templates/includes/registration/personal_details.html:21 -#: amelie/members/templates/includes/registration/personal_details_employee.html:21 -msgid "" -"Please give your first name, last name and last name prefix(es) in the three " -"different boxes, with correct capitalization." -msgstr "" -"Geef aub je voornaam, achternaam en tussenvoegsels in de drie verschillende " -"vakken, met correcte kapitalisatie." +#: amelie/members/templates/includes/registration/personal_details.html:21 amelie/members/templates/includes/registration/personal_details_employee.html:21 +msgid "Please give your first name, last name and last name prefix(es) in the three different boxes, with correct capitalization." +msgstr "Geef aub je voornaam, achternaam en tussenvoegsels in de drie verschillende vakken, met correcte kapitalisatie." -#: amelie/members/templates/includes/registration/personal_details.html:34 -#: amelie/members/templates/includes/registration/personal_details_employee.html:34 -msgid "" -"These are the initials of your first name (and optional baptismal name(s)), " -"excluding the first letter of your last name." -msgstr "" -"Dit zijn de voorletters van je voornaam en doopnamen, niet de eerste letter " -"van je achternaam." +#: amelie/members/templates/includes/registration/personal_details.html:34 amelie/members/templates/includes/registration/personal_details_employee.html:34 +msgid "These are the initials of your first name (and optional baptismal name(s)), excluding the first letter of your last name." +msgstr "Dit zijn de voorletters van je voornaam en doopnamen, niet de eerste letter van je achternaam." -#: amelie/members/templates/includes/registration/personal_details.html:47 -#: amelie/members/templates/includes/registration/personal_details_employee.html:47 +#: amelie/members/templates/includes/registration/personal_details.html:47 amelie/members/templates/includes/registration/personal_details_employee.html:47 msgid "Please fill in your date of birth in the format \"yyyy-mm-dd\"." msgstr "Vul aub. je geboortedatum in in het formaat \"jjjj-mm-dd\"." -#: amelie/members/templates/includes/registration/personal_details.html:60 -#: amelie/members/templates/includes/registration/personal_details_employee.html:60 +#: amelie/members/templates/includes/registration/personal_details.html:60 amelie/members/templates/includes/registration/personal_details_employee.html:60 msgid "Your gender." msgstr "Je geslacht." -#: amelie/members/templates/includes/registration/personal_details.html:73 -#: amelie/members/templates/includes/registration/personal_details_employee.html:73 -msgid "" -"Your e-mail address. No worries, we won't send you any e-mails that you did " -"not ask for or which are not necessary for your membership. We recommend you " -"to use a personal email address, since your student email will stop working " -"when you graduate." -msgstr "" -"Je e-mailadres. Geen zorgen, we zullen je geen mail sturen zonder je dat " -"zelf aangeeft of zonder dat het nodig is voor je lidmaatschap. Wij raden je " -"aan om een persoonlijk mailadres te gebruiken, aangezien je studentenmail " -"stopt met werken zodra je bent afgestudeerd." +#: amelie/members/templates/includes/registration/personal_details.html:73 amelie/members/templates/includes/registration/personal_details_employee.html:73 +msgid "Your e-mail address. No worries, we won't send you any e-mails that you did not ask for or which are not necessary for your membership. We recommend you to use a personal email address, since your student email will stop working when you graduate." +msgstr "Je e-mailadres. Geen zorgen, we zullen je geen mail sturen zonder je dat zelf aangeeft of zonder dat het nodig is voor je lidmaatschap. Wij raden je aan om een persoonlijk mailadres te gebruiken, aangezien je studentenmail stopt met werken zodra je bent afgestudeerd." -#: amelie/members/templates/includes/registration/personal_details.html:86 -#: amelie/members/templates/includes/registration/personal_details_employee.html:86 -msgid "" -"This is the language that the website will be shown in, and in which you " -"will receive any information mails." -msgstr "" -"Dit is de taal waarin de website voor jou wordt weergegeven, en waarin je " -"informatiemails krijgt toegestuurd." +#: amelie/members/templates/includes/registration/personal_details.html:86 amelie/members/templates/includes/registration/personal_details_employee.html:86 +msgid "This is the language that the website will be shown in, and in which you will receive any information mails." +msgstr "Dit is de taal waarin de website voor jou wordt weergegeven, en waarin je informatiemails krijgt toegestuurd." #: amelie/members/templates/includes/registration/personal_details.html:98 -msgid "" -"If you are coming from abroad to study here or not. Is used to support the " -"integration of international students in our association." -msgstr "" -"Of je hier komt studeren vanuit het buitenland of niet. Wordt gebruikt om de " -"integratie van internationale studenten in de vereniging te ondersteunen." +msgid "If you are coming from abroad to study here or not. Is used to support the integration of international students in our association." +msgstr "Of je hier komt studeren vanuit het buitenland of niet. Wordt gebruikt om de integratie van internationale studenten in de vereniging te ondersteunen." #: amelie/members/templates/includes/registration/preferences.html:4 msgid "Before we forget..." @@ -8693,20 +6485,14 @@ msgid "We have some final questions for you." msgstr "We hebben nog een paar laatste vragen voor je." #: amelie/members/templates/includes/registration/preferences.html:14 -msgid "" -"These preferences can always be changed in your profile on the Inter-" -"Actief website later." -msgstr "" -"Deze voorkeuren kan je later altijd nog aanpassen in je profiel op de Inter-" -"Actief website." +msgid "These preferences can always be changed in your profile on the Inter-Actief website later." +msgstr "Deze voorkeuren kan je later altijd nog aanpassen in je profiel op de Inter-Actief website." -#: amelie/members/templates/includes/registration/study_freshmen.html:4 -#: amelie/members/templates/includes/registration/study_general.html:4 +#: amelie/members/templates/includes/registration/study_freshmen.html:4 amelie/members/templates/includes/registration/study_general.html:4 msgid "What are you studying?" msgstr "Wat ga je studeren?" -#: amelie/members/templates/includes/registration/study_freshmen.html:15 -#: amelie/members/templates/includes/registration/study_general.html:15 +#: amelie/members/templates/includes/registration/study_freshmen.html:15 amelie/members/templates/includes/registration/study_general.html:15 msgid "Choose one (or more) study/studies..." msgstr "Kies een (of meerdere) studie(s)..." @@ -8714,22 +6500,13 @@ msgstr "Kies een (of meerdere) studie(s)..." msgid "Which study/studies you will follow." msgstr "Welke studie(s) je gaat volgen." -#: amelie/members/templates/includes/registration/study_freshmen.html:39 -#: amelie/members/templates/includes/registration/study_general.html:39 +#: amelie/members/templates/includes/registration/study_freshmen.html:39 amelie/members/templates/includes/registration/study_general.html:39 msgid "Your student number, without the \"s\" (e.g. 0123456\")." msgstr "Je studentnummer zonder de \"s\" (bijv. \"0123456\")." #: amelie/members/templates/includes/registration/study_freshmen.html:45 -msgid "" -"If you are a first-year Bachelor student, you might be participating / have " -"participated in the Kick-In (the introduction period of the University). If " -"you did, please fill in the do group which you were a part of. If you did " -"not participate in the Kick-In, you can leave this field blank." -msgstr "" -"Als je een eerstejaars Bachelorstudent bent, dan doe je misschien mee / heb " -"je misschien meegedaan met de Kick-In (de introductieperiode van de " -"Universiteit). Als dat zo is, vul dan de doegroep in waar je in zit. Als je " -"niet hebt deelgenomen aan de Kick-In, laat dan dit veld leeg." +msgid "If you are a first-year Bachelor student, you might be participating / have participated in the Kick-In (the introduction period of the University). If you did, please fill in the do group which you were a part of. If you did not participate in the Kick-In, you can leave this field blank." +msgstr "Als je een eerstejaars Bachelorstudent bent, dan doe je misschien mee / heb je misschien meegedaan met de Kick-In (de introductieperiode van de Universiteit). Als dat zo is, vul dan de doegroep in waar je in zit. Als je niet hebt deelgenomen aan de Kick-In, laat dan dit veld leeg." #: amelie/members/templates/includes/registration/study_freshmen.html:53 msgid "Which do-group you are currently in." @@ -8744,19 +6521,12 @@ msgid "Freshman year" msgstr "Beginjaar" #: amelie/members/templates/includes/registration/study_general.html:52 -msgid "" -"In which year you started with this study/these studies. (In the format " -"yyyy)" -msgstr "" -"In welk jaar je bent begonnen met deze studie(s). (In het formaat jjjj)" +msgid "In which year you started with this study/these studies. (In the format yyyy)" +msgstr "In welk jaar je bent begonnen met deze studie(s). (In het formaat jjjj)" -#: amelie/members/templates/includes/registration/wizard_buttons.html:6 -#: amelie/members/templates/includes/registration/wizard_buttons.html:8 +#: amelie/members/templates/includes/registration/wizard_buttons.html:6 amelie/members/templates/includes/registration/wizard_buttons.html:8 msgid "Any changes on this page may be lost. Are you sure you want to go back?" -msgstr "" -"Veranderingen aangebracht op deze pagina gaan wellicht verloren. Weet je " -"zeker dat je terug wil gaan?" +msgstr "Veranderingen aangebracht op deze pagina gaan wellicht verloren. Weet je zeker dat je terug wil gaan?" #: amelie/members/templates/includes/registration/wizard_buttons.html:6 msgid "Back to first step" @@ -8778,9 +6548,7 @@ msgstr "Formulier versturen" msgid "Send form and print" msgstr "Formulier versturen en printen" -#: amelie/members/templates/members/datablock_html.mail:8 -#: amelie/members/templates/members/datablock_plain.mail:7 -#: amelie/tools/pdf.py:106 +#: amelie/members/templates/members/datablock_html.mail:8 amelie/members/templates/members/datablock_plain.mail:7 amelie/tools/pdf.py:106 msgid "International?" msgstr "Internationaal?" @@ -8789,28 +6557,16 @@ msgid "[Inter-Actief] Yearly checkup member administration" msgstr "[Inter-Actief] Jaarlijkse controle ledenadministratie" #: amelie/members/templates/members/datamail_html.mail:4 -msgid "" -"In order to keep the member database of Inter-Actief up to date, we " -"would like to ask you to check your data with us." -msgstr "" -"Om de ledenadministratie van Inter-Actief up-to-date te houden willen " -"we je vragen de gegevens die bij ons bekend zijn over jou te controleren." +msgid "In order to keep the member database of Inter-Actief up to date, we would like to ask you to check your data with us." +msgstr "Om de ledenadministratie van Inter-Actief up-to-date te houden willen we je vragen de gegevens die bij ons bekend zijn over jou te controleren." #: amelie/members/templates/members/datamail_html.mail:5 -msgid "" -"Below is your data. Are these no longer correct? You can update most of them " -"on" -msgstr "" -"Onderstaand zie je je gegevens. Zijn deze niet meer correct? Het meeste kan " -"je updaten op" +msgid "Below is your data. Are these no longer correct? You can update most of them on" +msgstr "Onderstaand zie je je gegevens. Zijn deze niet meer correct? Het meeste kan je updaten op" #: amelie/members/templates/members/datamail_html.mail:6 -msgid "" -"Is anything else incorrect which you can't edit yourself? Then please mail " -"the secretary or the entire board." -msgstr "" -"Is er iets anders onjuist wat je niet zelf kan aanpassen? Mail dan even de " -"secretaris of het hele bestuur." +msgid "Is anything else incorrect which you can't edit yourself? Then please mail the secretary or the entire board." +msgstr "Is er iets anders onjuist wat je niet zelf kan aanpassen? Mail dan even de secretaris of het hele bestuur." #: amelie/members/templates/members/datamail_html.mail:12 msgid "The board of" @@ -8821,28 +6577,16 @@ msgstr "Het bestuur van" msgid "" "Dear %(first_name)s,\n" "\n" -"In order to keep the member database of Inter-Actief up to date, we " -"would like to ask you to check your data with us.\n" -"Below is your data. Is this still accurate? You can update most of it on " -"https://www.inter-actief.utwente.nl/profile/edit. Is something incorrect and " -"you can't edit it yourself? Then please mail the secretary or the entire " -"board." +"In order to keep the member database of Inter-Actief up to date, we would like to ask you to check your data with us.\n" +"Below is your data. Is this still accurate? You can update most of it on https://www.inter-actief.utwente.nl/profile/edit. Is something incorrect and you can't edit it yourself? Then please mail the secretary or the entire board." msgstr "" "Beste %(first_name)s,\n" "\n" -"Om de ledenadministratie van Inter-Actief up-to-date te houden willen we je " -"vragen de gegevens die bij ons bekend zijn over jou te controleren.\n" -"Onderstaand zie je je gegevens. Zijn deze nog correct? Het meeste kan je " -"updaten op https://www.inter-actief.utwente.nl/profile/edit.\n" -"Is er iets onjuist wat je niet zelf kan aanpassen? Mail dan even de " -"secretaris of het hele bestuur." - -#: amelie/members/templates/members/datamail_plain.mail:9 -#: amelie/members/templates/members/verification_reminder.mail:16 -#: amelie/members/templates/members/yeartransfer_ended.mail:16 -#: amelie/members/templates/members/yeartransfer_ended_eniac.mail:12 -#: amelie/members/templates/members/yeartransfer_ended_final.mail:14 -#: amelie/members/templates/members/yeartransfer_prolonged.mail:23 +"Om de ledenadministratie van Inter-Actief up-to-date te houden willen we je vragen de gegevens die bij ons bekend zijn over jou te controleren.\n" +"Onderstaand zie je je gegevens. Zijn deze nog correct? Het meeste kan je updaten op https://www.inter-actief.utwente.nl/profile/edit.\n" +"Is er iets onjuist wat je niet zelf kan aanpassen? Mail dan even de secretaris of het hele bestuur." + +#: amelie/members/templates/members/datamail_plain.mail:9 amelie/members/templates/members/verification_reminder.mail:16 amelie/members/templates/members/yeartransfer_ended.mail:16 amelie/members/templates/members/yeartransfer_ended_eniac.mail:12 amelie/members/templates/members/yeartransfer_ended_final.mail:14 amelie/members/templates/members/yeartransfer_prolonged.mail:23 msgid "" "Kind regards,\n" "\n" @@ -8852,8 +6596,7 @@ msgstr "" "\n" "Het bestuur van Inter-Actief" -#: amelie/members/templates/members/payment_confirm_delete.html:5 -#: amelie/members/templates/members/payment_confirm_delete.html:10 +#: amelie/members/templates/members/payment_confirm_delete.html:5 amelie/members/templates/members/payment_confirm_delete.html:10 msgid "Remove payment" msgstr "Betaling verwijderen" @@ -8861,8 +6604,7 @@ msgstr "Betaling verwijderen" #, python-format msgid "" "\n" -" Are you sure you want to remove the payment " -"%(object)s?\n" +" Are you sure you want to remove the payment %(object)s?\n" " " msgstr "" "\n" @@ -8870,86 +6612,34 @@ msgstr "" #: amelie/members/templates/members/preregistration_welcome.mail:4 #, python-format -msgid "" -"[Inter-Actief] Welcome to Inter-/Actief/, %(name)s, please sign your " -"membership documents!" -msgstr "" -"[Inter-Actief] Welkom bij Inter-/Actief/, %(name)s, onderteken je " -"lidmaatschapsdocumenten!" +msgid "[Inter-Actief] Welcome to Inter-/Actief/, %(name)s, please sign your membership documents!" +msgstr "[Inter-Actief] Welkom bij Inter-/Actief/, %(name)s, onderteken je lidmaatschapsdocumenten!" #: amelie/members/templates/members/preregistration_welcome.mail:8 -msgid "" -"Thank you for wanting to become a member of Inter-Actief! To complete " -"your enrollment, you need to sign your membership form. By signing this " -"membership form, you agree to all terms of membership of the bylaws and the " -"Rules and Regulations of this association." -msgstr "" -"Bedankt dat je lid wilt worden van Inter-Actief! Om je inschrijving " -"af te ronden moet je je lidmaatschapsformulier ondertekenen. Door dit " -"formulier te ondertekenen ga je akkoord met alle voorwaarden van het " -"lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de " -"vereniging." +msgid "Thank you for wanting to become a member of Inter-Actief! To complete your enrollment, you need to sign your membership form. By signing this membership form, you agree to all terms of membership of the bylaws and the Rules and Regulations of this association." +msgstr "Bedankt dat je lid wilt worden van Inter-Actief! Om je inschrijving af te ronden moet je je lidmaatschapsformulier ondertekenen. Door dit formulier te ondertekenen ga je akkoord met alle voorwaarden van het lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de vereniging." #: amelie/members/templates/members/preregistration_welcome.mail:9 -msgid "" -"Thank you for wanting to become a member of Inter-/Actief/! To complete your " -"enrollment, you need to sign your membership form. By signing this " -"membership form, you agree to all terms of membership of the bylaws and the " -"Rules and Regulations of this association." -msgstr "" -"Bedankt dat je lid wilt worden van Inter-Actief! Om je inschrijving af te " -"ronden moet je je lidmaatschapsformulier ondertekenen. Door dit formulier te " -"ondertekenen ga je akkoord met alle voorwaarden van het lidmaatschap volgens " -"het Huishoudelijk Regelement en de Statuten van de vereniging." +msgid "Thank you for wanting to become a member of Inter-/Actief/! To complete your enrollment, you need to sign your membership form. By signing this membership form, you agree to all terms of membership of the bylaws and the Rules and Regulations of this association." +msgstr "Bedankt dat je lid wilt worden van Inter-Actief! Om je inschrijving af te ronden moet je je lidmaatschapsformulier ondertekenen. Door dit formulier te ondertekenen ga je akkoord met alle voorwaarden van het lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de vereniging." #: amelie/members/templates/members/preregistration_welcome.mail:11 -msgid "" -"If you opted for one or both authorizations to pay for your membership fee " -"and/or consumptions and activities, you will also need to sign these " -"authorizations." -msgstr "" -"Als je hebt gekozen voor een van de, of beide machtigingen om voor je " -"contributie en/of activiteiten te betalen, dan moet je deze machtigingen ook " -"ondertekenen." +msgid "If you opted for one or both authorizations to pay for your membership fee and/or consumptions and activities, you will also need to sign these authorizations." +msgstr "Als je hebt gekozen voor een van de, of beide machtigingen om voor je contributie en/of activiteiten te betalen, dan moet je deze machtigingen ook ondertekenen." #: amelie/members/templates/members/preregistration_welcome.mail:13 -msgid "" -"All forms that you will need to sign are attached to this e-mail. Print the " -"form(s), sign using pen and paper (note that there may be multiple pages), " -"and scan the document(s) using your printer. Alternatively, you can sign the " -"form(s) digitally using a program such as Adobe Acrobat Reader." -msgstr "" -"Alle formulieren die je moet ondertekenen zijn bijgevoegd in deze e-mail. " -"Print de formulieren, onderteken ze met pen en papier (let op dat er " -"mogelijk meerdere pagina's zijn), en scan de documenten in met je printer. " -"Je kunt ook de formulieren digitaal ondertekenen met een programma als Adobe " -"Acrobat Reader." +msgid "All forms that you will need to sign are attached to this e-mail. Print the form(s), sign using pen and paper (note that there may be multiple pages), and scan the document(s) using your printer. Alternatively, you can sign the form(s) digitally using a program such as Adobe Acrobat Reader." +msgstr "Alle formulieren die je moet ondertekenen zijn bijgevoegd in deze e-mail. Print de formulieren, onderteken ze met pen en papier (let op dat er mogelijk meerdere pagina's zijn), en scan de documenten in met je printer. Je kunt ook de formulieren digitaal ondertekenen met een programma als Adobe Acrobat Reader." #: amelie/members/templates/members/preregistration_welcome.mail:15 #, python-format -msgid "" -"Once signed, reply to this e-mail and attach the signed form(s), or send the " -"form(s) to secretary@inter-" -"actief.net, stating \"Enrollment %(number)s\" in the subject of the " -"email." -msgstr "" -"Wanneer je de formulieren hebt ondertekend, reageer dan op deze e-mail en " -"voeg de ondertekende formulieren toe als bijlage, of stuur ze op naar secretary@inter-actief.net, " -"zorg ervoor dat er \"Enrollment %(number)s\" in het onderwerp van de mail " -"staat." +msgid "Once signed, reply to this e-mail and attach the signed form(s), or send the form(s) to secretary@inter-actief.net, stating \"Enrollment %(number)s\" in the subject of the email." +msgstr "Wanneer je de formulieren hebt ondertekend, reageer dan op deze e-mail en voeg de ondertekende formulieren toe als bijlage, of stuur ze op naar secretary@inter-actief.net, zorg ervoor dat er \"Enrollment %(number)s\" in het onderwerp van de mail staat." #: amelie/members/templates/members/preregistration_welcome.mail:16 #, python-format -msgid "" -"Once signed, reply to this e-mail and attach the signed form(s), or send the " -"form(s) to secretary@inter-actief.net, stating \"Enrollment %(number)s\" in " -"the subject of the email." -msgstr "" -"Wanneer je de formulieren hebt ondertekend, reageer dan op deze e-mail en " -"voeg de ondertekende formulieren toe als bijlage, of stuur ze op naar " -"secretary@inter-actief.net, zorg ervoor dat er \"Enrollment %(number)s\" in " -"het onderwerp van de mail staat." +msgid "Once signed, reply to this e-mail and attach the signed form(s), or send the form(s) to secretary@inter-actief.net, stating \"Enrollment %(number)s\" in the subject of the email." +msgstr "Wanneer je de formulieren hebt ondertekend, reageer dan op deze e-mail en voeg de ondertekende formulieren toe als bijlage, of stuur ze op naar secretary@inter-actief.net, zorg ervoor dat er \"Enrollment %(number)s\" in het onderwerp van de mail staat." #: amelie/members/templates/members/preregistration_welcome.mail:18 msgid "" @@ -8993,187 +6683,69 @@ msgstr "Zie voor meer informatie" msgid "Greetings," msgstr "Groetjes," -#: amelie/members/templates/members/verification_reminder.mail:4 -#: amelie/members/templates/members/yeartransfer_ended.mail:4 -#: amelie/members/templates/members/yeartransfer_ended_eniac.mail:4 +#: amelie/members/templates/members/verification_reminder.mail:4 amelie/members/templates/members/yeartransfer_ended.mail:4 amelie/members/templates/members/yeartransfer_ended_eniac.mail:4 msgid "[Inter-Actief] Important information regarding your membership" msgstr "[Inter-Actief] Belangrijke informatie omtrent jouw lidmaatschap" #: amelie/members/templates/members/verification_reminder.mail:8 -msgid "" -"In a previous mailing, we asked you to verify your study in order to renew " -"your membership. Unfortunately, the mechanism for verifying your study was " -"broken during the past week, so if you have tried to verify your study " -"during this time, we ask you to log in to the Inter-Actief website using " -"your University account once more to complete the verification." -msgstr "" -"In een vorige mailing hebben we je gevraagd om je studie te verifiëren, " -"zodat we je lidmaatschap kunnen verlengen. Helaas was het mechanisme om je " -"studie te verifiëren de afgelopen week kapot, dus als je gedurende deze tijd " -"geprobeerd hebt om je studie te verifiëren, willen we je vragen om dit " -"nogmaals te doen door in te loggen in de Inter-Actief website met je " -"Universiteit-account, om de verificatie te voltooien." +msgid "In a previous mailing, we asked you to verify your study in order to renew your membership. Unfortunately, the mechanism for verifying your study was broken during the past week, so if you have tried to verify your study during this time, we ask you to log in to the Inter-Actief website using your University account once more to complete the verification." +msgstr "In een vorige mailing hebben we je gevraagd om je studie te verifiëren, zodat we je lidmaatschap kunnen verlengen. Helaas was het mechanisme om je studie te verifiëren de afgelopen week kapot, dus als je gedurende deze tijd geprobeerd hebt om je studie te verifiëren, willen we je vragen om dit nogmaals te doen door in te loggen in de Inter-Actief website met je Universiteit-account, om de verificatie te voltooien." #: amelie/members/templates/members/verification_reminder.mail:10 -msgid "" -"If you did not follow those steps yet, and you are still studying Business " -"Information Technology, Technical Computer Science or one of the masters " -"belonging to these studies, please visit our website and log in via " -"University of Twente in order to prolong your membership for free. You have " -"to do this in the next 7 days, otherwise your membership will be terminated " -"as of the 1st of July." -msgstr "" -"Als je deze stappen nog niet hebt gevolgd, maar je nog wel steeds Business " -"Information Technology, Technical Computer Science of een van de " -"bijbehorende masters studeert, bezoek dan onze website en log in via " -"Universiteit Twente. Door dit te doen kunnen wij je studielange lidmaatschap " -"gratis verlengen. Doe dit in de komende 7 dagen, want anders zal je " -"lidmaatschap worden beëindigd op 1 juli." +msgid "If you did not follow those steps yet, and you are still studying Business Information Technology, Technical Computer Science or one of the masters belonging to these studies, please visit our website and log in via University of Twente in order to prolong your membership for free. You have to do this in the next 7 days, otherwise your membership will be terminated as of the 1st of July." +msgstr "Als je deze stappen nog niet hebt gevolgd, maar je nog wel steeds Business Information Technology, Technical Computer Science of een van de bijbehorende masters studeert, bezoek dan onze website en log in via Universiteit Twente. Door dit te doen kunnen wij je studielange lidmaatschap gratis verlengen. Doe dit in de komende 7 dagen, want anders zal je lidmaatschap worden beëindigd op 1 juli." #: amelie/members/templates/members/verification_reminder.mail:12 -msgid "" -"You can check if your study is verified by visiting your profile on the " -"Inter-Actief website. Under the block \"Membership\" you can find the " -"verification status. If it says \"Your student status has been verified, or " -"we do not need it for your membership type.\" next to a green checkmark, " -"your membership will be renewed as normal and you do not need to take " -"action. If it says \"Your student status has not been verified, while we do " -"need it for your membership type.\" next to a red cross, you will need to " -"follow the procedure above." -msgstr "" -"Je kan zelf zien of je studie al is geverifiëerd door naar je profiel op de " -"Inter-Actief website te gaan. Onder het blokje \"Lidmaatschap\" kan je de " -"huidige status vinden. Als daar staat \"Je studentenstatus is geverifieerd " -"of we hebben het niet nodig voor jouw lidmaatschapstype.\" naast een groen " -"vinkje, dan wordt je lidmaatschap gewoon verlengd en hoef je niks te doen. " -"Als er staat \"Jouw status als student is niet geverifieerd, terwijl we dit " -"wel nodig hebben voor jouw lidmaatschapstype.\" naast een rood kruis, dan " -"zul je de procedure hierboven moeten volgen." - -#: amelie/members/templates/members/verification_reminder.mail:14 -#: amelie/members/templates/members/yeartransfer_ended.mail:14 +msgid "You can check if your study is verified by visiting your profile on the Inter-Actief website. Under the block \"Membership\" you can find the verification status. If it says \"Your student status has been verified, or we do not need it for your membership type.\" next to a green checkmark, your membership will be renewed as normal and you do not need to take action. If it says \"Your student status has not been verified, while we do need it for your membership type.\" next to a red cross, you will need to follow the procedure above." +msgstr "Je kan zelf zien of je studie al is geverifiëerd door naar je profiel op de Inter-Actief website te gaan. Onder het blokje \"Lidmaatschap\" kan je de huidige status vinden. Als daar staat \"Je studentenstatus is geverifieerd of we hebben het niet nodig voor jouw lidmaatschapstype.\" naast een groen vinkje, dan wordt je lidmaatschap gewoon verlengd en hoef je niks te doen. Als er staat \"Jouw status als student is niet geverifieerd, terwijl we dit wel nodig hebben voor jouw lidmaatschapstype.\" naast een rood kruis, dan zul je de procedure hierboven moeten volgen." + +#: amelie/members/templates/members/verification_reminder.mail:14 amelie/members/templates/members/yeartransfer_ended.mail:14 msgid "If you have any questions you can contact us by replying to this email." -msgstr "" -"Als je nog vragen hebt, kun je natuurlijk altijd reageren op deze mail." +msgstr "Als je nog vragen hebt, kun je natuurlijk altijd reageren op deze mail." #: amelie/members/templates/members/yeartransfer_ended.mail:8 -msgid "" -"During the previous period, you have not logged in on our website via the " -"University of Twente login. Because of this, we were unable to get your " -"current student status, meaning we cannot prolong your membership as a study " -"long type." -msgstr "" -"Tijdens de afgelopen periode ben je niet ingelogd geweest op onze website " -"door in te loggen via Universiteit Twente. Daarom hebben we niet je " -"studentenstatus kunnen verifiëren, wat betekent dat we je studielang " -"lidmaatschap niet kunnen verlengen." +msgid "During the previous period, you have not logged in on our website via the University of Twente login. Because of this, we were unable to get your current student status, meaning we cannot prolong your membership as a study long type." +msgstr "Tijdens de afgelopen periode ben je niet ingelogd geweest op onze website door in te loggen via Universiteit Twente. Daarom hebben we niet je studentenstatus kunnen verifiëren, wat betekent dat we je studielang lidmaatschap niet kunnen verlengen." #: amelie/members/templates/members/yeartransfer_ended.mail:10 -msgid "" -"If you have not graduated yet and are still studying Business Information " -"Technology, Technical Computer Science or one of the masters belonging to " -"these studies, please visit our website and log in via University of Twente " -"in order to prolong your membership for free. You have to do this within 14 " -"days, otherwise your membership will be terminated as of the 1st of July. " -msgstr "" -"Als je nog niet afgestudeerd bent en nog steeds Business Information " -"Technology, Technical Computer Science of een van de bijbehorende masters " -"studeert, bezoek dan onze website en log in via Universiteit Twente. Door " -"dit te doen kunnen wij je studielange lidmaatschap gratis verlengen. Doe dit " -"binnen 14 dagen, want anders zal je lidmaatschap beëindigt worden op 1 juli." +msgid "If you have not graduated yet and are still studying Business Information Technology, Technical Computer Science or one of the masters belonging to these studies, please visit our website and log in via University of Twente in order to prolong your membership for free. You have to do this within 14 days, otherwise your membership will be terminated as of the 1st of July. " +msgstr "Als je nog niet afgestudeerd bent en nog steeds Business Information Technology, Technical Computer Science of een van de bijbehorende masters studeert, bezoek dan onze website en log in via Universiteit Twente. Door dit te doen kunnen wij je studielange lidmaatschap gratis verlengen. Doe dit binnen 14 dagen, want anders zal je lidmaatschap beëindigt worden op 1 juli." #: amelie/members/templates/members/yeartransfer_ended.mail:12 -msgid "" -"If you have graduated, your membership of Inter-Actief will end. There is " -"however still the opportunity to become a member of ENIAC, the alumni " -"association for TCS, BIT, CS, ITECH, EMSYS, and IST." -msgstr "" -"Als je afgestudeerd bent zal je lidmaatschap bij Inter-Actief eindigen. Er " -"is echter alsnog een optie om lid te worden van ENIAC, de alumni vereniging " -"voor TCS, BIT, CS, ITECH, EMSYS en IST." +msgid "If you have graduated, your membership of Inter-Actief will end. There is however still the opportunity to become a member of ENIAC, the alumni association for TCS, BIT, CS, ITECH, EMSYS, and IST." +msgstr "Als je afgestudeerd bent zal je lidmaatschap bij Inter-Actief eindigen. Er is echter alsnog een optie om lid te worden van ENIAC, de alumni vereniging voor TCS, BIT, CS, ITECH, EMSYS en IST." -#: amelie/members/templates/members/yeartransfer_ended.mail:12 -#: amelie/members/templates/members/yeartransfer_ended_final.mail:10 -msgid "" -"If you want to know more about ENIAC or if you want to become a member, take " -"a look at their website, https://eniac." -"utwente.nl/. The board of ENIAC can be contacted using the contact form " -"on their website." -msgstr "" -"Als je meer wilt weten over ENIAC of als je lid wilt worden, kijk dan even " -"naar hun website, https://eniac." -"utwente.nl. Het bestuur van ENIAC kan bereikt worden via het " -"contactformulier op hun website." +#: amelie/members/templates/members/yeartransfer_ended.mail:12 amelie/members/templates/members/yeartransfer_ended_final.mail:10 +msgid "If you want to know more about ENIAC or if you want to become a member, take a look at their website, https://eniac.utwente.nl/. The board of ENIAC can be contacted using the contact form on their website." +msgstr "Als je meer wilt weten over ENIAC of als je lid wilt worden, kijk dan even naar hun website, https://eniac.utwente.nl. Het bestuur van ENIAC kan bereikt worden via het contactformulier op hun website." -#: amelie/members/templates/members/yeartransfer_ended.mail:12 -#: amelie/members/templates/members/yeartransfer_ended_final.mail:10 -msgid "" -"If you want to know more about ENIAC or if you want to become a member, take " -"a look at their website, eniac.utwente.nl. The board of ENIAC can be " -"contacted using the contact form on their website." -msgstr "" -"Als je meer wilt weten over ENIAC of lid wil worden, kijk dan even op hun " -"website, eniac.utwente.nl. Het bestuur van ENIAC kan bereikt worden via het " -"contactformulier op hun website." +#: amelie/members/templates/members/yeartransfer_ended.mail:12 amelie/members/templates/members/yeartransfer_ended_final.mail:10 +msgid "If you want to know more about ENIAC or if you want to become a member, take a look at their website, eniac.utwente.nl. The board of ENIAC can be contacted using the contact form on their website." +msgstr "Als je meer wilt weten over ENIAC of lid wil worden, kijk dan even op hun website, eniac.utwente.nl. Het bestuur van ENIAC kan bereikt worden via het contactformulier op hun website." #: amelie/members/templates/members/yeartransfer_ended_eniac.mail:8 -msgid "" -"During the previous academic year, you were enrolled at Inter-Actief via " -"ENIAC. Every year, your membership as ENIAC member is reset." -msgstr "" -"Tijdens het afgelopen academisch jaar was je ingeschreven bij Inter-Actief " -"via ENIAC. Echter verloopt je lidmaatschap bij Inter-Actief als ENIAC lid " -"ieder jaar." +msgid "During the previous academic year, you were enrolled at Inter-Actief via ENIAC. Every year, your membership as ENIAC member is reset." +msgstr "Tijdens het afgelopen academisch jaar was je ingeschreven bij Inter-Actief via ENIAC. Echter verloopt je lidmaatschap bij Inter-Actief als ENIAC lid ieder jaar." #: amelie/members/templates/members/yeartransfer_ended_eniac.mail:10 -msgid "" -"If you are still a member of ENIAC, you can respond to this email with the " -"request to prolong your 'membership' at Inter-Actief. This is only necessary " -"if you plan on joining activities of Inter-Actief or if you plan on using " -"the cookie corner of Inter-Actief. If not, you don't have to do anything. Of " -"course, you can always reactivate your membership at Inter-Actief at a later " -"moment if needed." -msgstr "" -"Als je nog steeds lid bent van ENIAC, kun je reageren op deze mail met een " -"verzoek om je 'lidmaatschap' te verlengen bij Inter-Actief. Dit is enkel " -"nodig als je van plan bent om activiteiten van Inter-Actief bij te wonen of " -"de cookie corner bij Inter-Actief te gebruiken. Zo niet, dan hoef je niets " -"te doen. Natuurlijk kun je op ieder ander moment je lidmaatschap bij Inter-" -"Actief heractiveren indien nodig." +msgid "If you are still a member of ENIAC, you can respond to this email with the request to prolong your 'membership' at Inter-Actief. This is only necessary if you plan on joining activities of Inter-Actief or if you plan on using the cookie corner of Inter-Actief. If not, you don't have to do anything. Of course, you can always reactivate your membership at Inter-Actief at a later moment if needed." +msgstr "Als je nog steeds lid bent van ENIAC, kun je reageren op deze mail met een verzoek om je 'lidmaatschap' te verlengen bij Inter-Actief. Dit is enkel nodig als je van plan bent om activiteiten van Inter-Actief bij te wonen of de cookie corner bij Inter-Actief te gebruiken. Zo niet, dan hoef je niets te doen. Natuurlijk kun je op ieder ander moment je lidmaatschap bij Inter-Actief heractiveren indien nodig." #: amelie/members/templates/members/yeartransfer_ended_final.mail:4 msgid "[Inter-Actief] Termination of membership" msgstr "[Inter-Actief] Beëindiging lidmaatschap" #: amelie/members/templates/members/yeartransfer_ended_final.mail:8 -msgid "" -"According to our administration you no longer study Computer Science, " -"Business Information Technology or one of the connected masters. Therefore " -"your study duration lasting membership of Inter-Actief will end on the first " -"of July." -msgstr "" -"Omdat je volgens onze gegevens geen TCS, BIT of een bijbehorende master " -"studeert, wordt je studielange lidmaatschap van Inter-Actief per 1 juli " -"beëindigd." +msgid "According to our administration you no longer study Computer Science, Business Information Technology or one of the connected masters. Therefore your study duration lasting membership of Inter-Actief will end on the first of July." +msgstr "Omdat je volgens onze gegevens geen TCS, BIT of een bijbehorende master studeert, wordt je studielange lidmaatschap van Inter-Actief per 1 juli beëindigd." #: amelie/members/templates/members/yeartransfer_ended_final.mail:10 -msgid "" -"Most likely you have graduated. Even though your membership of Inter-Actief " -"will end, there is still the opportunity to become a member of ENIAC, the " -"alumni association for TCS, BIT, CS, ITECH, EMSYS, and IST." -msgstr "" -"Vermoedelijk ben je dus afgestudeerd. Ondanks dat je lidmaatschap bij Inter-" -"Actief 1 juli beëindigd wordt is er wel de gelegenheid om lid te worden bij " -"ENIAC, de alumnivereniging voor de opleidingen TCS, BIT, CS, ITECH, EMSYS, " -"en IST." +msgid "Most likely you have graduated. Even though your membership of Inter-Actief will end, there is still the opportunity to become a member of ENIAC, the alumni association for TCS, BIT, CS, ITECH, EMSYS, and IST." +msgstr "Vermoedelijk ben je dus afgestudeerd. Ondanks dat je lidmaatschap bij Inter-Actief 1 juli beëindigd wordt is er wel de gelegenheid om lid te worden bij ENIAC, de alumnivereniging voor de opleidingen TCS, BIT, CS, ITECH, EMSYS, en IST." #: amelie/members/templates/members/yeartransfer_ended_final.mail:12 -msgid "" -"If our administration is wrong or if you have any questions you can contact " -"us by replying to this email." -msgstr "" -"Als onze gegevens niet kloppen of als je nog vragen hebt kun je contact " -"opnemen door te reageren op deze mail." +msgid "If our administration is wrong or if you have any questions you can contact us by replying to this email." +msgstr "Als onze gegevens niet kloppen of als je nog vragen hebt kun je contact opnemen door te reageren op deze mail." #: amelie/members/templates/members/yeartransfer_prolonged.mail:4 msgid "[Inter-Actief] Membership renewal" @@ -9198,45 +6770,24 @@ msgstr "€ %(price)s per jaar" #: amelie/members/templates/members/yeartransfer_prolonged.mail:13 #, python-format -msgid "" -"The contribution will be withdrawn by direct debit from you bank account " -"%(iban)s at the end of July." +msgid "The contribution will be withdrawn by direct debit from you bank account %(iban)s at the end of July." msgstr "De contributie wordt eind juli van je rekening %(iban)s afgeschreven." #: amelie/members/templates/members/yeartransfer_prolonged.mail:15 -msgid "" -"Currently, we have the following information about you in our administration:" +msgid "Currently, we have the following information about you in our administration:" msgstr "Op dit moment zijn deze gegevens van jou bij ons bekend:" #: amelie/members/templates/members/yeartransfer_prolonged.mail:19 -msgid "" -"In case you want to end your membership, you can do so by replying to the " -"email before the first of July." -msgstr "" -"Wil je je lidmaatschap opzeggen, dan kan dit voor 1 juli door te reageren op " -"deze mail." +msgid "In case you want to end your membership, you can do so by replying to the email before the first of July." +msgstr "Wil je je lidmaatschap opzeggen, dan kan dit voor 1 juli door te reageren op deze mail." #: amelie/members/templates/members/yeartransfer_prolonged.mail:21 -msgid "" -"In case the above information is faulty, you can edit it at https://www.inter-" -"actief.utwente.nl/profile/edit or by replying to this email. For " -"questions you can also contact the board." -msgstr "" -"Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-" -"actief.utwente.nl/profile/edit of door te reageren op deze mail. Voor " -"vragen kun je contact opnemen met het bestuur." +msgid "In case the above information is faulty, you can edit it at https://www.inter-actief.utwente.nl/profile/edit or by replying to this email. For questions you can also contact the board." +msgstr "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-actief.utwente.nl/profile/edit of door te reageren op deze mail. Voor vragen kun je contact opnemen met het bestuur." #: amelie/members/templates/members/yeartransfer_prolonged.mail:21 -msgid "" -"In case the above information is faulty, you can edit it at https://www." -"inter-actief.utwente.nl/profile/edit or by replying to this email. For " -"questions you can also contact the board." -msgstr "" -"Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www." -"inter-actief.utwente.nl/profile/edit of door te reageren op deze mail. Voor " -"vragen kun je contact opnemen met het bestuur." +msgid "In case the above information is faulty, you can edit it at https://www.inter-actief.utwente.nl/profile/edit or by replying to this email. For questions you can also contact the board." +msgstr "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-actief.utwente.nl/profile/edit of door te reageren op deze mail. Voor vragen kun je contact opnemen met het bestuur." #: amelie/members/templates/message.html:9 msgid "Confirmation message" @@ -9246,14 +6797,11 @@ msgstr "Bevestigingsbericht" msgid "The command is being executed..." msgstr "De opdracht wordt uitgevoerd..." -#: amelie/members/templates/person.html:35 -#: amelie/members/templates/person_study.html:8 -#: templates/profile_overview.html:98 templates/profile_overview.html:107 +#: amelie/members/templates/person.html:35 amelie/members/templates/person_study.html:8 templates/profile_overview.html:98 templates/profile_overview.html:107 msgid "Student data" msgstr "Studentgegevens" -#: amelie/members/templates/person.html:44 -#: amelie/members/templates/person_employee.html:8 +#: amelie/members/templates/person.html:44 amelie/members/templates/person_employee.html:8 msgid "Employee data" msgstr "Medewerkergegevens" @@ -9262,21 +6810,12 @@ msgid "Anonymize person" msgstr "Persoon anonimiseren" #: amelie/members/templates/person.html:74 -msgid "" -"With this button the personal details of this person that the association " -"does not need to keep for legal reasons will be anonymized." -msgstr "" -"Met deze knop worden alle gegevens van deze persoon die niet wettelijk nodig " -"zijn voor de vereniging geanonimiseerd." +msgid "With this button the personal details of this person that the association does not need to keep for legal reasons will be anonymized." +msgstr "Met deze knop worden alle gegevens van deze persoon die niet wettelijk nodig zijn voor de vereniging geanonimiseerd." #: amelie/members/templates/person.html:75 -msgid "" -"Warning: Anonymizing a person is irreversible! Only do this if the person " -"themselves have indicated that they want their personal data removed!" -msgstr "" -"Waarschuwing: Het anonimiseren van een persoon is onomkeerbaar! Doe dit " -"alleen als de persoon zelf aangegeven heeft zijn gegevens te willen " -"verwijderen!" +msgid "Warning: Anonymizing a person is irreversible! Only do this if the person themselves have indicated that they want their personal data removed!" +msgstr "Waarschuwing: Het anonimiseren van een persoon is onomkeerbaar! Doe dit alleen als de persoon zelf aangegeven heeft zijn gegevens te willen verwijderen!" #: amelie/members/templates/person.html:78 msgid "Anonymize this person" @@ -9284,8 +6823,7 @@ msgstr "Deze persoon anonimiseren" #: amelie/members/templates/person.html:81 msgid "This person cannot be anonymized because of the following reasons:" -msgstr "" -"Deze persoon kan niet worden geanonimiseerd vanwege de volgende redenen:" +msgstr "Deze persoon kan niet worden geanonimiseerd vanwege de volgende redenen:" #: amelie/members/templates/person_activate_mandate.html:3 msgid "Activate mandate" @@ -9304,22 +6842,18 @@ msgstr "" #: amelie/members/templates/person_activate_mandate.html:13 msgid "" "\n" -" Only do this if the mandate has been signed and is in the " -"treasurer's folder or mailbox.\n" +" Only do this if the mandate has been signed and is in the treasurer's folder or mailbox.\n" " " msgstr "" "\n" "Doe dit alleen wanneer de machtiging getekend is en deze in de map of\n" "het postvakje van de penningmeester zit." -#: amelie/members/templates/person_activate_mandate.html:22 -#: amelie/members/templates/person_mandate.html:64 -#: amelie/personal_tab/templates/info/rfid_cards.html:58 +#: amelie/members/templates/person_activate_mandate.html:22 amelie/members/templates/person_mandate.html:64 amelie/personal_tab/templates/info/rfid_cards.html:58 msgid "Activate" msgstr "Activeren" -#: amelie/members/templates/person_anonymization_success.html:4 -#: amelie/members/templates/person_anonymization_success.html:9 +#: amelie/members/templates/person_anonymization_success.html:4 amelie/members/templates/person_anonymization_success.html:9 msgid "Person has been anonymized" msgstr "Persoon is geanonimiseerd" @@ -9340,8 +6874,7 @@ msgstr "Verwijder account" #, python-format msgid "" "\n" -" Are you sure you want to delete: %(person)s (id=%(id)s)?" -"
    \n" +" Are you sure you want to delete: %(person)s (id=%(id)s)?
    \n" " The following things will be removed as well:
    \n" " " msgstr "" @@ -9358,8 +6891,7 @@ msgstr "Lidmaatschap: %(id)s" msgid "Yes, throw away" msgstr "Ja, gooi maar weg." -#: amelie/members/templates/person_edit_data.html:4 -#: amelie/members/templates/person_edit_data.html:8 +#: amelie/members/templates/person_edit_data.html:4 amelie/members/templates/person_edit_data.html:8 msgid "Change profile " msgstr "Persoon wijzigen" @@ -9368,11 +6900,8 @@ msgid "Are you sure?" msgstr "Weet je het zeker?" #: amelie/members/templates/person_edit_functions.html:4 -msgid "" -"There is no accountname set. Without accountname, a person cannot log in." -msgstr "" -"Er is geen accountnaam ingesteld. Zonder accountnaam kan deze persoon niet " -"inloggen." +msgid "There is no accountname set. Without accountname, a person cannot log in." +msgstr "Er is geen accountnaam ingesteld. Zonder accountnaam kan deze persoon niet inloggen." #: amelie/members/templates/person_edit_study.html:15 msgid "Graduated?" @@ -9382,17 +6911,7 @@ msgstr "Afgestudeerd?" msgid "Add new course" msgstr "Nieuwe studie toevoegen" -#: amelie/members/templates/person_edit_studyperiod.html:15 -#: amelie/members/templates/person_new_mandate.html:14 -#: amelie/members/templates/person_new_membership.html:14 -#: amelie/members/templates/registration_check.html:120 -#: amelie/personal_tab/templates/cookie_corner/transaction_form.html:32 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit_add.html:22 -#: amelie/room_duty/templates/room_duty/pool/list.html:12 -#: amelie/room_duty/templates/room_duty/pool/persons_change.html:48 -#: amelie/room_duty/templates/room_duty/table/change_persons.html:48 -#: amelie/room_duty/templates/room_duty/table/list.html:12 -#: amelie/room_duty/templates/room_duty/template/list.html:12 +#: amelie/members/templates/person_edit_studyperiod.html:15 amelie/members/templates/person_new_mandate.html:14 amelie/members/templates/person_new_membership.html:14 amelie/members/templates/registration_check.html:120 amelie/personal_tab/templates/cookie_corner/transaction_form.html:32 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit_add.html:22 amelie/room_duty/templates/room_duty/pool/list.html:12 amelie/room_duty/templates/room_duty/pool/persons_change.html:48 amelie/room_duty/templates/room_duty/table/change_persons.html:48 amelie/room_duty/templates/room_duty/table/list.html:12 amelie/room_duty/templates/room_duty/template/list.html:12 msgid "Add" msgstr "Toevoegen" @@ -9406,8 +6925,7 @@ msgstr "" "\n" "%(obj)s is geen medewerker" -#: amelie/members/templates/person_employee.html:28 -#: amelie/members/templates/person_study.html:48 +#: amelie/members/templates/person_employee.html:28 amelie/members/templates/person_study.html:48 msgid "Configure" msgstr "Stel in" @@ -9439,44 +6957,23 @@ msgstr "" "\n" "%(obj)s heeft geen machtigingen." -#: amelie/members/templates/person_mandate.html:10 -#: amelie/members/templates/person_mandate.html:79 -#: amelie/members/templates/person_new_mandate.html:3 +#: amelie/members/templates/person_mandate.html:10 amelie/members/templates/person_mandate.html:79 amelie/members/templates/person_new_mandate.html:3 msgid "Add mandate" msgstr "Voeg machtiging toe" -#: amelie/members/templates/person_mandate.html:18 -#: amelie/personal_tab/forms.py:115 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:66 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:115 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:90 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:47 -#: amelie/personal_tab/templates/info/account_information.html:12 -#: amelie/personal_tab/templates/lists/authorization_select.html:10 +#: amelie/members/templates/person_mandate.html:18 amelie/personal_tab/forms.py:115 amelie/personal_tab/templates/cookie_corner_authorization_list.html:66 amelie/personal_tab/templates/cookie_corner_authorization_view.html:115 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:90 amelie/personal_tab/templates/cookie_corner_process_batch.html:47 amelie/personal_tab/templates/info/account_information.html:12 amelie/personal_tab/templates/lists/authorization_select.html:10 msgid "Reference" msgstr "Kenmerk" -#: amelie/members/templates/person_mandate.html:19 -#: amelie/members/templates/person_membership.html:35 -#: amelie/personal_tab/forms.py:127 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:67 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:17 -#: amelie/personal_tab/templates/info/account_information.html:13 -#: amelie/personal_tab/templates/lists/authorization_select.html:11 +#: amelie/members/templates/person_mandate.html:19 amelie/members/templates/person_membership.html:35 amelie/personal_tab/forms.py:127 amelie/personal_tab/templates/cookie_corner_authorization_list.html:67 amelie/personal_tab/templates/cookie_corner_authorization_view.html:17 amelie/personal_tab/templates/info/account_information.html:13 amelie/personal_tab/templates/lists/authorization_select.html:11 msgid "Sort" msgstr "Soort" -#: amelie/members/templates/person_mandate.html:20 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:69 -#: amelie/personal_tab/templates/info/account_information.html:14 +#: amelie/members/templates/person_mandate.html:20 amelie/personal_tab/templates/cookie_corner_authorization_list.html:69 amelie/personal_tab/templates/info/account_information.html:14 msgid "IBAN/BIC" msgstr "IBAN/BIC" -#: amelie/members/templates/person_mandate.html:21 -#: amelie/personal_tab/forms.py:117 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:41 -#: amelie/personal_tab/templates/info/account_information.html:15 -#: amelie/tools/pdf.py:394 +#: amelie/members/templates/person_mandate.html:21 amelie/personal_tab/forms.py:117 amelie/personal_tab/templates/cookie_corner_authorization_view.html:41 amelie/personal_tab/templates/info/account_information.html:15 amelie/tools/pdf.py:394 msgid "Account holder" msgstr "Rekeninghouder" @@ -9484,15 +6981,11 @@ msgstr "Rekeninghouder" msgid "Signed" msgstr "Getekend" -#: amelie/members/templates/person_mandate.html:52 -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:105 -#: amelie/personal_tab/templates/info/account_information.html:42 -#: amelie/personal_tab/templates/lists/authorization_select.html:46 +#: amelie/members/templates/person_mandate.html:52 amelie/personal_tab/templates/cookie_corner_authorization_list.html:105 amelie/personal_tab/templates/info/account_information.html:42 amelie/personal_tab/templates/lists/authorization_select.html:46 msgid "before September 2013" msgstr "voor september 2013" -#: amelie/members/templates/person_mandate.html:63 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:54 +#: amelie/members/templates/person_mandate.html:63 amelie/personal_tab/templates/cookie_corner_authorization_view.html:54 msgid "print" msgstr "afdrukken" @@ -9510,8 +7003,7 @@ msgstr "" "\n" "%(obj)s is geen lid." -#: amelie/members/templates/person_membership.html:10 -#: amelie/members/templates/person_membership.html:95 +#: amelie/members/templates/person_membership.html:10 amelie/members/templates/person_membership.html:95 msgid "Add membership" msgstr "Voeg lidmaatschap toe" @@ -9532,8 +7024,7 @@ msgstr "%(first_name)s is geverifieerd als student of heeft dit niet nodig." #: amelie/members/templates/person_membership.html:24 #, python-format msgid "%(first_name)s has no verified student status while this is needed." -msgstr "" -"%(first_name)s is niet geverifieerd als student terwijl dit wel nodig is." +msgstr "%(first_name)s is niet geverifieerd als student terwijl dit wel nodig is." #: amelie/members/templates/person_membership.html:28 #, python-format @@ -9593,8 +7084,7 @@ msgstr "Inschrijven nieuw eerstejaars lid" msgid "Enrollment of new member" msgstr "Inschrijven nieuw lid" -#: amelie/members/templates/person_registration_form_preregister_complete.html:5 -#: amelie/members/templates/person_registration_form_preregister_complete.html:12 +#: amelie/members/templates/person_registration_form_preregister_complete.html:5 amelie/members/templates/person_registration_form_preregister_complete.html:12 msgid "Pre-enrollment successful" msgstr "Voorinschrijving geslaagd" @@ -9604,30 +7094,15 @@ msgstr "Je voorinschrijving is geslaagd!" #: amelie/members/templates/person_registration_form_preregister_complete.html:18 msgid "Please check your e-mail for your enrollment form(s) and sign them!" -msgstr "" -"Controleer je e-mail voor je inschrijvingsformulier(en) en onderteken ze!" +msgstr "Controleer je e-mail voor je inschrijvingsformulier(en) en onderteken ze!" #: amelie/members/templates/person_registration_form_preregister_complete.html:21 -msgid "" -"To finalize your enrollment at Inter-Actief, you will need to sign " -"your membership form generated with the details you provided in previous " -"steps. By signing this membership form, you agree to all terms of membership " -"of the bylaws and the Rules and Regulations of this association." -msgstr "" -"Om je inschrijving bij Inter-Actief af te ronden, moet je je " -"lidmaatschapsformulier ondertekenen die is gegenereerd met de details die je " -"in de vorige stappen hebt opgegeven. Door dit formulier te ondertekenen ga " -"je akkoord met alle voorwaarden van het lidmaatschap volgens het " -"Huishoudelijk Regelement en de Statuten van de vereniging." +msgid "To finalize your enrollment at Inter-Actief, you will need to sign your membership form generated with the details you provided in previous steps. By signing this membership form, you agree to all terms of membership of the bylaws and the Rules and Regulations of this association." +msgstr "Om je inschrijving bij Inter-Actief af te ronden, moet je je lidmaatschapsformulier ondertekenen die is gegenereerd met de details die je in de vorige stappen hebt opgegeven. Door dit formulier te ondertekenen ga je akkoord met alle voorwaarden van het lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de vereniging." #: amelie/members/templates/person_registration_form_preregister_complete.html:24 -msgid "" -"If you opted for one or both mandates to pay for your membership fee and/or " -"consumptions and activities, you will also need to sign these mandates." -msgstr "" -"Als je hebt gekozen voor een van de, of beide machtigingen om voor je " -"contributie en activiteiten te betalen, dan moet je deze machtigingen ook " -"ondertekenen." +msgid "If you opted for one or both mandates to pay for your membership fee and/or consumptions and activities, you will also need to sign these mandates." +msgstr "Als je hebt gekozen voor een van de, of beide machtigingen om voor je contributie en activiteiten te betalen, dan moet je deze machtigingen ook ondertekenen." #: amelie/members/templates/person_registration_form_preregister_complete.html:27 msgid "See you soon at Inter-Actief!" @@ -9645,18 +7120,15 @@ msgstr "Terug naar hoofdpagina" msgid "Pre-enroll new freshman member" msgstr "Nieuw eerstejaarslid voorinschrijven" -#: amelie/members/templates/person_study.html:10 -#: templates/profile_overview.html:109 +#: amelie/members/templates/person_study.html:10 templates/profile_overview.html:109 msgid "Period(s)" msgstr "Periode(s)" -#: amelie/members/templates/person_study.html:19 -#: templates/profile_overview.html:118 +#: amelie/members/templates/person_study.html:19 templates/profile_overview.html:118 msgid "No doegroep registered" msgstr "Geen doegroep geregistreerd" -#: amelie/members/templates/person_study.html:21 templates/basis.html:135 -#: templates/profile_overview.html:120 +#: amelie/members/templates/person_study.html:21 templates/basis.html:135 templates/profile_overview.html:120 msgid "Current" msgstr "Actueel" @@ -9670,13 +7142,11 @@ msgstr "" "\n" "%(obj)s is geen student." -#: amelie/members/templates/preregistration_delete_confirm.html:4 -#: amelie/members/templates/preregistration_print_all.html:4 +#: amelie/members/templates/preregistration_delete_confirm.html:4 amelie/members/templates/preregistration_print_all.html:4 msgid "Pre-enrollment" msgstr "Voorinschrijving" -#: amelie/members/templates/preregistration_delete_confirm.html:4 -#: amelie/members/templates/preregistration_delete_confirm.html:8 +#: amelie/members/templates/preregistration_delete_confirm.html:4 amelie/members/templates/preregistration_delete_confirm.html:8 msgid "Confirm deletion" msgstr "Bevestig verwijderen" @@ -9684,21 +7154,18 @@ msgstr "Bevestig verwijderen" #, python-format msgid "" "\n" -" Do you really want to delete the pre-enrollment of %(name)s " -"of do-group %(dogroup)s?\n" +" Do you really want to delete the pre-enrollment of %(name)s of do-group %(dogroup)s?\n" " " msgstr "" "\n" -"Weet je zeker dat je de voorinschrijving van %(name)s van doegroep " -"%(dogroup)s wilt verwijderen?\n" +"Weet je zeker dat je de voorinschrijving van %(name)s van doegroep %(dogroup)s wilt verwijderen?\n" " " #: amelie/members/templates/preregistration_print_all.html:4 msgid "Print all forms" msgstr "Print alle formulieren" -#: amelie/members/templates/preregistration_print_all.html:8 -#: amelie/members/templates/preregistration_status.html:28 +#: amelie/members/templates/preregistration_print_all.html:8 amelie/members/templates/preregistration_status.html:28 msgid "Print all membership and authorization forms" msgstr "Print alle lidmaatschaps- en machtigingsformulieren" @@ -9722,52 +7189,29 @@ msgstr "In welke taal moeten deze formulieren worden geprint?" msgid "Print those forms!" msgstr "Print die formulieren!" -#: amelie/members/templates/preregistration_print_all.html:45 -#: amelie/personal_tab/templates/pos/shop.html:13 -#: amelie/personal_tab/templates/register/register_card_error.html:14 -#: amelie/personal_tab/templates/register/register_card_scan.html:54 +#: amelie/members/templates/preregistration_print_all.html:45 amelie/personal_tab/templates/pos/shop.html:13 amelie/personal_tab/templates/register/register_card_error.html:14 amelie/personal_tab/templates/register/register_card_scan.html:54 msgid "Go back" msgstr "Ga terug" -#: amelie/members/templates/preregistration_status.html:5 -#: amelie/members/templates/preregistration_status.html:11 -#: templates/frontpage.html:116 +#: amelie/members/templates/preregistration_status.html:5 amelie/members/templates/preregistration_status.html:11 templates/frontpage.html:116 msgid "Pre-enrollment status" msgstr "Status van voorinschrijvingen" #: amelie/members/templates/preregistration_status.html:14 -msgid "" -"These are the current pre-enrollments that are not activated yet, per do-" -"group." -msgstr "" -"Dit zijn de huidige voorinschrinvingen die nog niet zijn geactiveerd, per " -"doegroep." +msgid "These are the current pre-enrollments that are not activated yet, per do-group." +msgstr "Dit zijn de huidige voorinschrinvingen die nog niet zijn geactiveerd, per doegroep." #: amelie/members/templates/preregistration_status.html:17 -msgid "" -"If the member has signed their membership and authorization forms, you can " -"click the \"Activate\" () button to " -"activate the membership (and authorizations)." -msgstr "" -"Als het lid hun lidmaatschaps- en machtigingsformulieren hebben ondertekend, " -"dan kan je op de \"Activeer\" () knop " -"drukken om het lidmaatschap (en de machtigingen) van het lid te activeren." +msgid "If the member has signed their membership and authorization forms, you can click the \"Activate\" () button to activate the membership (and authorizations)." +msgstr "Als het lid hun lidmaatschaps- en machtigingsformulieren hebben ondertekend, dan kan je op de \"Activeer\" () knop drukken om het lidmaatschap (en de machtigingen) van het lid te activeren." #: amelie/members/templates/preregistration_status.html:18 -msgid "" -"You can also re-print the forms for that member by clicking the \"Print" -"\" () button." -msgstr "" -"Je kan ook de formulieren van een lid opnieuw printen door op de \"Print" -"\" () knop te drukken." +msgid "You can also re-print the forms for that member by clicking the \"Print\" () button." +msgstr "Je kan ook de formulieren van een lid opnieuw printen door op de \"Print\" () knop te drukken." #: amelie/members/templates/preregistration_status.html:20 -msgid "" -"Click the \"Delete\" () button to delete " -"the pre-enrollment." -msgstr "" -"Klik op de \"Verwijder\" () knop om de " -"voorinschrijving te verwijderen." +msgid "Click the \"Delete\" () button to delete the pre-enrollment." +msgstr "Klik op de \"Verwijder\" () knop om de voorinschrijving te verwijderen." #: amelie/members/templates/preregistration_status.html:25 msgid "Pre-enroll member" @@ -9814,14 +7258,11 @@ msgstr "Meer zoekmogelijkheden" msgid "Advanced search form" msgstr "Uitgebreid zoekformulier" -#: amelie/members/templates/registration_check.html:4 -#: amelie/members/templates/registration_check.html:14 +#: amelie/members/templates/registration_check.html:4 amelie/members/templates/registration_check.html:14 msgid "Enrollment check" msgstr "Inschrijfcontrole" -#: amelie/members/templates/registration_check.html:29 -#: amelie/personal_tab/templates/exports/screen.html:60 -#: templates/profile_overview.html:10 +#: amelie/members/templates/registration_check.html:29 amelie/personal_tab/templates/exports/screen.html:60 templates/profile_overview.html:10 msgid "Data" msgstr "Gegevens" @@ -9849,24 +7290,19 @@ msgstr "unknown id" msgid "invalid atqa/sak" msgstr "invalid atqa/sak" -#: amelie/members/templates/registration_check.html:99 -#: amelie/personal_tab/templates/info/rfid_cards.html:12 +#: amelie/members/templates/registration_check.html:99 amelie/personal_tab/templates/info/rfid_cards.html:12 msgid "Card" msgstr "Kaart" -#: amelie/members/templates/registration_check.html:108 -#: amelie/personal_tab/models.py:373 -#: amelie/personal_tab/templates/info/rfid_cards.html:31 +#: amelie/members/templates/registration_check.html:108 amelie/personal_tab/models.py:373 amelie/personal_tab/templates/info/rfid_cards.html:31 msgid "Activated" msgstr "Geactiveerd" -#: amelie/members/templates/registration_check.html:110 -#: amelie/personal_tab/templates/info/rfid_cards.html:33 +#: amelie/members/templates/registration_check.html:110 amelie/personal_tab/templates/info/rfid_cards.html:33 msgid "Not activated" msgstr "Niet geactiveerd" -#: amelie/members/templates/registration_check.html:115 -#: amelie/personal_tab/templates/info/rfid_cards.html:74 +#: amelie/members/templates/registration_check.html:115 amelie/personal_tab/templates/info/rfid_cards.html:74 msgid "You didn't register any rfid cards." msgstr "Er zijn geen rfid-kaarten geregistreerd." @@ -9887,68 +7323,45 @@ msgstr "Hoofdstatistieken" msgid "" "\n" " Total number of members: %(members_count)s
    \n" -" Number of active members (INF/BIT/Otherwise): " -"%(active_members_count)s (%(active_members_tcs_count)s/" -"%(active_members_bit_count)s/%(active_members_other_count)s)
    \n" -" Number of active freshmen INF/BIT: " -"%(active_freshmen_tcs_count)s/%(active_freshmen_bit_count)s
    \n" -" Number of freshmen (INF/BIT): %(freshmen_count)s " -"(%(freshmen_tcs_count)s/%(freshmen_bit_count)s)
    \n" -" Percentage active members: %(percent_active_members)s" -"%%
    \n" -" Percentage active freshmen (relative to active " -"members): %(percent_active_freshmen)s%%
    \n" -" Faculty staff that are member: %(employee_count)s
    \n" +" Number of active members (INF/BIT/Otherwise): %(active_members_count)s (%(active_members_tcs_count)s/%(active_members_bit_count)s/%(active_members_other_count)s)
    \n" +" Number of active freshmen INF/BIT: %(active_freshmen_tcs_count)s/%(active_freshmen_bit_count)s
    \n" +" Number of freshmen (INF/BIT): %(freshmen_count)s (%(freshmen_tcs_count)s/%(freshmen_bit_count)s)
    \n" +" Percentage active members: %(percent_active_members)s%%
    \n" +" Percentage active freshmen (relative to active members): %(percent_active_freshmen)s%%
    \n" +" Faculty staff that are member: %(employee_count)s
    \n" " Number of committees: %(committee_count)s
    \n" -" Filled committee spots: %(per_committee_total)s
    \n" -" Average number of committees per active member (ex " -"pools): %(average_committees_per_active_member)s " -"(%(average_committees_ex_pools_per_active_member)s)
    \n" -" Number of people in 1 committee: %(committees_1)s
    \n" -" Number of people in 2 committees: " -"%(committees_2)s
    \n" -" Number of people in 3 committees: " -"%(committees_3)s
    \n" -" Number of people in 4 committees: " -"%(committees_4)s
    \n" -" Number of people in 5 committees: " -"%(committees_5)s
    \n" -" Number of people in 6 or more committees: " -"%(per_active_member_total_6plus)s
    \n" -" Number of international members: " -"%(international_members_count)s
    \n" -" Number of active international members: " -"%(active_international_members_count)s\n" +" Filled committee spots: %(per_committee_total)s
    \n" +" Average number of committees per active member (ex pools): %(average_committees_per_active_member)s (%(average_committees_ex_pools_per_active_member)s)
    \n" +" Number of people in 1 committee: %(committees_1)s
    \n" +" Number of people in 2 committees: %(committees_2)s
    \n" +" Number of people in 3 committees: %(committees_3)s
    \n" +" Number of people in 4 committees: %(committees_4)s
    \n" +" Number of people in 5 committees: %(committees_5)s
    \n" +" Number of people in 6 or more committees: %(per_active_member_total_6plus)s
    \n" +" Number of international members: %(international_members_count)s
    \n" +" Number of active international members: %(active_international_members_count)s\n" " " msgstr "" "\n" "Totaal aantal leden: %(members_count)s
    \n" -"Aantal actieve leden (INF/BIT/Anders): %(active_members_count)s " -"(%(active_members_tcs_count)s/\n" +"Aantal actieve leden (INF/BIT/Anders): %(active_members_count)s (%(active_members_tcs_count)s/\n" "%(active_members_bit_count)s/%(active_members_other_count)s)
    \n" "Aantal actieve eerstejaars INF/BIT: %(active_freshmen_tcs_count)s/\n" "%(active_freshmen_bit_count)s
    \n" "Aantal eerstejaars (INF/BIT): %(freshmen_count)s (%(freshmen_tcs_count)s/\n" "%(freshmen_bit_count)s)
    \n" "Percentage actieve leden: %(percent_active_members)s%%
    \n" -"Percentage actieve eerstejaars (t.o.v. actieve leden): " -"%(percent_active_freshmen)s%%
    \n" +"Percentage actieve eerstejaars (t.o.v. actieve leden): %(percent_active_freshmen)s%%
    \n" "Medewerkers lid: %(employee_count)s
    \n" "Aantal commissies: %(committee_count)s
    \n" "Gevulde commissieplekken: %(per_committee_total)s
    \n" -"Aantal commissies per actief lid (ex poules): " -"%(average_committees_per_active_member)s " -"(%(average_committees_ex_pools_per_active_member)s)
    \n" +"Aantal commissies per actief lid (ex poules): %(average_committees_per_active_member)s (%(average_committees_ex_pools_per_active_member)s)
    \n" "Aantal mensen met 1 commissie: %(committees_1)s
    \n" "Aantal mensen met 2 commissies: %(committees_2)s
    \n" "Aantal mensen met 3 commissies: %(committees_3)s
    \n" "Aantal mensen met 4 commissies: %(committees_4)s
    \n" "Aantal mensen met 5 commissies: %(committees_5)s
    \n" -"Aantal mensen met 6 of meer commissies: %(per_active_member_total_6plus)s
    \n" +"Aantal mensen met 6 of meer commissies: %(per_active_member_total_6plus)s
    \n" "Aantal internationale leden: %(international_members_count)s
    \n" "Aantal actieve internationale leden: %(active_international_members_count)s" @@ -9988,9 +7401,7 @@ msgstr "Betalingen statistieken" msgid "Payments" msgstr "Betalingen" -#: amelie/members/templates/statistics/payments.html:29 -#: amelie/personal_tab/statistics.py:291 -#: amelie/personal_tab/templates/wrapped.html:85 +#: amelie/members/templates/statistics/payments.html:29 amelie/personal_tab/statistics.py:291 amelie/personal_tab/templates/wrapped.html:85 msgid "Totals" msgstr "Totalen" @@ -10008,12 +7419,8 @@ msgstr "Deze persoon heeft nog een actief (niet beeindigd) lidmaatschap." #: amelie/members/views.py:275 #, python-brace-format -msgid "" -"This person has not paid one of their memberships ({year}/{next_year} " -"{type})." -msgstr "" -"Deze persoon heeft een lidmaatschap nog niet betaald ({year}/{next_year} " -"{type})." +msgid "This person has not paid one of their memberships ({year}/{next_year} {type})." +msgstr "Deze persoon heeft een lidmaatschap nog niet betaald ({year}/{next_year} {type})." #: amelie/members/views.py:284 msgid "This person still has an outstanding balance on their personal tab." @@ -10021,8 +7428,7 @@ msgstr "Deze persoon heeft nog een openstaand streeplijstsaldo." #: amelie/members/views.py:287 msgid "This person isn't enrolled for one or more future activities." -msgstr "" -"Deze persoon staat ingeschreven voor een of meer toekomstige activiteit(en)." +msgstr "Deze persoon staat ingeschreven voor een of meer toekomstige activiteit(en)." #: amelie/members/views.py:302 msgid "" @@ -10038,14 +7444,11 @@ msgid "OAuth link code and instructions were sent to {name}." msgstr "OAuth link code en instructies zijn verzonden naar {name}." #: amelie/members/views.py:1574 -msgid "" -"You are not allowed to manually delete the payments of free memberships." -msgstr "" -"Je mag van gratis lidmaatschappen de betaling niet handmatig verwijderen." +msgid "You are not allowed to manually delete the payments of free memberships." +msgstr "Je mag van gratis lidmaatschappen de betaling niet handmatig verwijderen." #: amelie/members/views.py:1577 -msgid "" -"You are not allowed to delete payments that are already (being) debited." +msgid "You are not allowed to delete payments that are already (being) debited." msgstr "Je mag geen betalingen verwijderen die al geïncasseerd zijn/worden." #: amelie/members/views.py:1581 @@ -10065,19 +7468,15 @@ msgstr "Bezig met laden" msgid "Inter-/Actief/ Room Narrowcasting" msgstr "Narrowcasting Inter-/Actief/-kamer" -#: amelie/narrowcasting/templates/room.html:39 -#: amelie/narrowcasting/templates/room.html:51 +#: amelie/narrowcasting/templates/room.html:39 amelie/narrowcasting/templates/room.html:51 msgid "Album image" msgstr "Albumafbeelding" -#: amelie/narrowcasting/templates/room.html:42 -#: amelie/narrowcasting/templates/room.html:54 -#: amelie/narrowcasting/templates/room.html:207 +#: amelie/narrowcasting/templates/room.html:42 amelie/narrowcasting/templates/room.html:54 amelie/narrowcasting/templates/room.html:207 msgid "Not playing anything..." msgstr "Niks aan het afspelen..." -#: amelie/narrowcasting/templates/room.html:64 -#: amelie/narrowcasting/templates/room.html:202 +#: amelie/narrowcasting/templates/room.html:64 amelie/narrowcasting/templates/room.html:202 msgid "Loading activity information..." msgstr "Activiteitsinformatie laden..." @@ -10141,9 +7540,7 @@ msgstr "Onbekende artiest" msgid "Error while getting spotify data" msgstr "Fout bij het ophalen van data van spotify" -#: amelie/narrowcasting/views.py:20 amelie/narrowcasting/views.py:105 -#: amelie/narrowcasting/views.py:160 amelie/narrowcasting/views.py:193 -#: amelie/narrowcasting/views.py:225 +#: amelie/narrowcasting/views.py:20 amelie/narrowcasting/views.py:105 amelie/narrowcasting/views.py:160 amelie/narrowcasting/views.py:193 amelie/narrowcasting/views.py:225 msgid "Spotify settings not configured." msgstr "Spotify-instellingen niet gevonden." @@ -10163,13 +7560,11 @@ msgstr "Geen authorisatiecode of staat gegeven." msgid "No such authentication attempt found, try again." msgstr "Geen authenticatiepoging gevonden, probeer het opnieuw." -#: amelie/narrowcasting/views.py:163 amelie/narrowcasting/views.py:196 -#: amelie/narrowcasting/views.py:228 +#: amelie/narrowcasting/views.py:163 amelie/narrowcasting/views.py:196 amelie/narrowcasting/views.py:228 msgid "Missing identifier" msgstr "Missende identificatie" -#: amelie/narrowcasting/views.py:168 amelie/narrowcasting/views.py:201 -#: amelie/narrowcasting/views.py:233 +#: amelie/narrowcasting/views.py:168 amelie/narrowcasting/views.py:201 amelie/narrowcasting/views.py:233 msgid "No association for this identifier" msgstr "Geen koppeling voor deze identificatie" @@ -10181,25 +7576,40 @@ msgstr "IA Nieuws" msgid "The news by your favorite Study Association" msgstr "Het nieuws van jouw favoriete studievereniging" -#: amelie/news/forms.py:10 amelie/news/forms.py:11 -#: amelie/news/templates/news_item_form.html:38 +#: amelie/news/forms.py:10 amelie/news/forms.py:11 amelie/news/templates/news_item_form.html:38 msgid "Introduction" msgstr "Inleiding" #: amelie/news/forms.py:10 amelie/news/forms.py:11 -msgid "" -"This text can be lay-outed in 175 characters (markdown)" -msgstr "" -"Deze tekst kan worden opgemaakt in 175 tekens (markdown)" +msgid "This text can be lay-outed in 175 characters (markdown)" +msgstr "Deze tekst kan worden opgemaakt in 175 tekens (markdown)" -#: amelie/news/forms.py:13 -#: amelie/videos/templates/videos/ia_video_form.html:100 -#: amelie/videos/templates/videos/yt_video_form.html:100 +#: amelie/news/forms.py:13 amelie/videos/templates/videos/ia_video_form.html:100 amelie/videos/templates/videos/yt_video_form.html:100 msgid "Publisher" msgstr "Uitgever" +#: amelie/news/graphql.py:38 +#| msgid "Message (Dutch)" +msgid "Message author" +msgstr "Auteur van dit bericht" + +#: amelie/news/graphql.py:39 amelie/videos/graphql.py:54 +#| msgid "Change committee" +msgid "Publishing committee" +msgstr "Publiceer commissei" + +#: amelie/news/graphql.py:42 +msgid "Message title (localized for user)" +msgstr "Bericht titel (aangepast aan de taal van de gebruiker)" + +#: amelie/news/graphql.py:43 +msgid "Message introduction (localized for user)" +msgstr "Bericht introductie (aangepast aan de taal van de gebruiker)" + +#: amelie/news/graphql.py:44 +msgid "Message content (localized for user)" +msgstr "Bericht inhoud (aangepast aan de taal van de gebruiker)" + #: amelie/news/models.py:35 msgid "Choose this option to pin the news item" msgstr "Kies deze optie om dit nieuwsbericht vast te zetten" @@ -10208,8 +7618,7 @@ msgstr "Kies deze optie om dit nieuwsbericht vast te zetten" msgid "News message" msgstr "Nieuwsbericht" -#: amelie/news/models.py:40 -#: amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:6 +#: amelie/news/models.py:40 amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:6 msgid "News messages" msgstr "Nieuwsberichten" @@ -10217,33 +7626,23 @@ msgstr "Nieuwsberichten" msgid "Are you sure you want to remove this message" msgstr "Weet je zeker dat je dit bericht wilt verwijderen?" -#: amelie/news/templates/news_item_form.html:4 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:4 +#: amelie/news/templates/news_item_form.html:4 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:4 msgid "New news message" msgstr "Nieuw nieuwsbericht" -#: amelie/news/templates/news_item_form.html:9 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:10 +#: amelie/news/templates/news_item_form.html:9 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:10 msgid "Add new news message" msgstr "Nieuw nieuwsbericht toevoegen" -#: amelie/news/templates/news_item_form.html:9 -#: amelie/news/templates/news_item_form.html:83 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:11 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:69 +#: amelie/news/templates/news_item_form.html:9 amelie/news/templates/news_item_form.html:83 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:11 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:69 msgid "Edit news message" msgstr "Nieuwsbericht wijzigen" #: amelie/news/templates/news_item_form.html:45 -msgid "" -"Please note, the introduction is shown on the front page, and is also placed " -"before the content on the message page itself." -msgstr "" -"Let op, de inleiding wordt getoond op de homepage, en komt ook voor de " -"inhoud bij het bericht zelf te staan." +msgid "Please note, the introduction is shown on the front page, and is also placed before the content on the message page itself." +msgstr "Let op, de inleiding wordt getoond op de homepage, en komt ook voor de inhoud bij het bericht zelf te staan." -#: amelie/news/templates/news_item_form.html:83 -#: amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:69 +#: amelie/news/templates/news_item_form.html:83 amelie/weekmail/templates/weekmail/weekmailnewsarticle_form.html:69 msgid "Create news message" msgstr "Nieuwsbericht aanmaken" @@ -10287,29 +7686,23 @@ msgstr "Nieuwe OAuth toegangsaanvraag" msgid "A new OAuth access request has been performed by a party." msgstr "Er is een nieuwe OAuth aanvraag geplaatst door een partij." -#: amelie/oauth/templates/oauth_access_request.mail:8 -#: amelie/oauth/templates/request_oauth_sent.html:14 +#: amelie/oauth/templates/oauth_access_request.mail:8 amelie/oauth/templates/request_oauth_sent.html:14 msgid "Member Name" msgstr "Naam van lid" -#: amelie/oauth/templates/oauth_access_request.mail:9 -#: amelie/oauth/templates/request_oauth_sent.html:15 +#: amelie/oauth/templates/oauth_access_request.mail:9 amelie/oauth/templates/request_oauth_sent.html:15 msgid "Member Mail" msgstr "Email van lid" -#: amelie/oauth/templates/oauth_access_request.mail:10 -#: amelie/oauth/templates/request_oauth_sent.html:16 +#: amelie/oauth/templates/oauth_access_request.mail:10 amelie/oauth/templates/request_oauth_sent.html:16 msgid "Redirect URLs" msgstr "Redirect URLs" -#: amelie/oauth/templates/oauth_access_request.mail:11 -#: amelie/oauth/templates/request_oauth_sent.html:22 +#: amelie/oauth/templates/oauth_access_request.mail:11 amelie/oauth/templates/request_oauth_sent.html:22 msgid "Client Type" msgstr "Client Type" -#: amelie/oauth/templates/request_oauth.html:3 -#: amelie/oauth/templates/request_oauth.html:7 -#: amelie/oauth/templates/request_oauth.html:57 +#: amelie/oauth/templates/request_oauth.html:3 amelie/oauth/templates/request_oauth.html:7 amelie/oauth/templates/request_oauth.html:57 msgid "Request OAuth2 Access" msgstr "OAuth2 toegang aanvragen" @@ -10334,12 +7727,10 @@ msgid "Is this a confidential or public client?" msgstr "Is deze client prive of publiek?" #: amelie/oauth/templates/request_oauth.html:52 -msgid "" -"Please give a short description of the intended purpose of this application." +msgid "Please give a short description of the intended purpose of this application." msgstr "Geef hier een korte beschrijving van het doel van deze applicatie." -#: amelie/oauth/templates/request_oauth_sent.html:3 -#: amelie/oauth/templates/request_oauth_sent.html:7 +#: amelie/oauth/templates/request_oauth_sent.html:3 amelie/oauth/templates/request_oauth_sent.html:7 msgid "OAuth2 Access Request Submitted" msgstr "De OAuth2 toegang aanvraag is verstuurd" @@ -10357,12 +7748,8 @@ msgstr "Applicatienaam" #: amelie/personal_tab/debt_collection.py:98 #, python-brace-format -msgid "" -"Contribution Inter-Actief {membership_type} {name} Questions? call 053-489 " -"3756" -msgstr "" -"Contributie Inter-Actief {membership_type} {name} Voor vragen bel 053-489 " -"3756" +msgid "Contribution Inter-Actief {membership_type} {name} Questions? call 053-489 3756" +msgstr "Contributie Inter-Actief {membership_type} {name} Voor vragen bel 053-489 3756" #: amelie/personal_tab/debt_collection.py:157 #, python-brace-format @@ -10376,10 +7763,8 @@ msgstr "Contributie {membership_type} ({begin_year}/{end_year})" #: amelie/personal_tab/debt_collection.py:221 #, python-brace-format -msgid "" -"Personal tab Inter-Actief till {date} {name} Questions? call 053-489 3756" -msgstr "" -"Streeplijst Inter-Actief tot {date} {name} Voor vragen bel 053-489 3756" +msgid "Personal tab Inter-Actief till {date} {name} Questions? call 053-489 3756" +msgstr "Streeplijst Inter-Actief tot {date} {name} Voor vragen bel 053-489 3756" #: amelie/personal_tab/debt_collection.py:287 #, python-brace-format @@ -10400,23 +7785,15 @@ msgstr "Terugboeking contributie {membership_type} ({start_year}/{end_year})" msgid "Description for within Inter-Actief" msgstr "Interne omschrijving" -#: amelie/personal_tab/forms.py:38 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:62 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:60 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:20 +#: amelie/personal_tab/forms.py:38 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:62 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:60 amelie/personal_tab/templates/cookie_corner_process_batch.html:20 msgid "Date of execution" msgstr "Uitvoerdatum" -#: amelie/personal_tab/forms.py:39 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:283 +#: amelie/personal_tab/forms.py:39 amelie/personal_tab/templates/cookie_corner_statistics.html:283 msgid "Membership fee" msgstr "Contributie" -#: amelie/personal_tab/forms.py:40 -#: amelie/personal_tab/templates/cookie_corner_balance.html:29 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:39 -#: amelie/personal_tab/templates/lists/transactions_totals.html:21 -#: amelie/statistics/templates/statistics.html:60 templates/basis.html:259 +#: amelie/personal_tab/forms.py:40 amelie/personal_tab/templates/cookie_corner_balance.html:29 amelie/personal_tab/templates/cookie_corner_transactions_new.html:39 amelie/personal_tab/templates/lists/transactions_totals.html:21 amelie/statistics/templates/statistics.html:60 templates/basis.html:259 msgid "Personal tab" msgstr "Streeplijst" @@ -10476,9 +7853,7 @@ msgstr "begin" msgid "end" msgstr "eind" -#: amelie/personal_tab/models.py:21 amelie/personal_tab/models.py:84 -#: amelie/personal_tab/models.py:640 amelie/personal_tab/models.py:763 -#: amelie/publications/models.py:19 +#: amelie/personal_tab/models.py:21 amelie/personal_tab/models.py:84 amelie/personal_tab/models.py:640 amelie/personal_tab/models.py:763 amelie/publications/models.py:19 msgid "description" msgstr "omschrijving" @@ -10494,8 +7869,7 @@ msgstr "artikelen" msgid "balance account number" msgstr "balansrekeningnummer" -#: amelie/personal_tab/models.py:42 amelie/personal_tab/models.py:50 -#: amelie/personal_tab/models.py:80 +#: amelie/personal_tab/models.py:42 amelie/personal_tab/models.py:50 amelie/personal_tab/models.py:80 msgid "discount offer" msgstr "kortingsactie" @@ -10503,23 +7877,15 @@ msgstr "kortingsactie" msgid "discount offers" msgstr "kortingsacties" -#: amelie/personal_tab/models.py:47 amelie/personal_tab/models.py:82 -#: amelie/personal_tab/models.py:766 +#: amelie/personal_tab/models.py:47 amelie/personal_tab/models.py:82 amelie/personal_tab/models.py:766 msgid "amount" msgstr "bedrag" -#: amelie/personal_tab/models.py:48 amelie/personal_tab/models.py:81 -#: amelie/personal_tab/models.py:604 +#: amelie/personal_tab/models.py:48 amelie/personal_tab/models.py:81 amelie/personal_tab/models.py:604 msgid "date" msgstr "datum" -#: amelie/personal_tab/models.py:57 amelie/personal_tab/models.py:85 -#: amelie/personal_tab/models.py:125 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:62 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:108 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:149 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:13 -#: amelie/personal_tab/templates/pos/success.html:37 +#: amelie/personal_tab/models.py:57 amelie/personal_tab/models.py:85 amelie/personal_tab/models.py:125 amelie/personal_tab/templates/cookie_corner_statistics.html:62 amelie/personal_tab/templates/cookie_corner_statistics.html:108 amelie/personal_tab/templates/cookie_corner_statistics.html:149 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:13 amelie/personal_tab/templates/pos/success.html:37 msgid "discount" msgstr "korting" @@ -10543,8 +7909,7 @@ msgstr "kortingstegoed" msgid "discount balances" msgstr "kortingstegoeden" -#: amelie/personal_tab/models.py:127 -#: amelie/personal_tab/templates/info/transaction_information.html:15 +#: amelie/personal_tab/models.py:127 amelie/personal_tab/templates/info/transaction_information.html:15 msgid "Direct withdrawal" msgstr "Incasso" @@ -10552,30 +7917,15 @@ msgstr "Incasso" msgid "Transaction" msgstr "Transactie" -#: amelie/personal_tab/models.py:138 -#: amelie/personal_tab/templates/cookie_corner_activity_transactions.html:4 -#: amelie/personal_tab/templates/cookie_corner_activity_transactions.html:9 -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:33 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:159 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:191 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:4 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:9 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:28 -#: amelie/personal_tab/templates/price_list.html:4 +#: amelie/personal_tab/models.py:138 amelie/personal_tab/templates/cookie_corner_activity_transactions.html:4 amelie/personal_tab/templates/cookie_corner_activity_transactions.html:9 amelie/personal_tab/templates/cookie_corner_dashboard.html:33 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:159 amelie/personal_tab/templates/cookie_corner_statistics.html:191 amelie/personal_tab/templates/cookie_corner_transactions_new.html:4 amelie/personal_tab/templates/cookie_corner_transactions_new.html:9 amelie/personal_tab/templates/cookie_corner_transactions_new.html:28 amelie/personal_tab/templates/price_list.html:4 msgid "Transactions" msgstr "Transacties" -#: amelie/personal_tab/models.py:182 -#: amelie/personal_tab/templates/lists/activity_transactions.html:13 +#: amelie/personal_tab/models.py:182 amelie/personal_tab/templates/lists/activity_transactions.html:13 msgid "More sign up options" msgstr "Met inschrijfopties" -#: amelie/personal_tab/models.py:199 amelie/personal_tab/models.py:302 -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:14 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:59 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:147 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:11 -#: amelie/personal_tab/templates/price_list.html:15 +#: amelie/personal_tab/models.py:199 amelie/personal_tab/models.py:302 amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:14 amelie/personal_tab/templates/cookie_corner_statistics.html:59 amelie/personal_tab/templates/cookie_corner_statistics.html:147 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:11 amelie/personal_tab/templates/price_list.html:15 msgid "Article" msgstr "Artikel" @@ -10583,9 +7933,7 @@ msgstr "Artikel" msgid "Transaction id" msgstr "Transactie Id" -#: amelie/personal_tab/models.py:261 amelie/personal_tab/models.py:284 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:60 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:106 +#: amelie/personal_tab/models.py:261 amelie/personal_tab/models.py:284 amelie/personal_tab/templates/cookie_corner_statistics.html:60 amelie/personal_tab/templates/cookie_corner_statistics.html:106 msgid "General ledger account" msgstr "Grootboekrekening" @@ -10597,13 +7945,7 @@ msgstr "Grootboekrekeningen" msgid "Image" msgstr "Afbeelding" -#: amelie/personal_tab/models.py:289 -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:22 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:15 -#: amelie/personal_tab/templates/lists/transactions.html:13 -#: amelie/personal_tab/templates/lists/transactions_totals.html:27 -#: amelie/personal_tab/templates/pos/success.html:40 -#: amelie/personal_tab/templates/price_list.html:17 +#: amelie/personal_tab/models.py:289 amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:22 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:15 amelie/personal_tab/templates/lists/transactions.html:13 amelie/personal_tab/templates/lists/transactions_totals.html:27 amelie/personal_tab/templates/pos/success.html:40 amelie/personal_tab/templates/price_list.html:17 msgid "kCal" msgstr "kCal" @@ -10617,8 +7959,7 @@ msgstr "Laat de calculator zien in de Point of Sale in plaats van de producten" #: amelie/personal_tab/models.py:325 msgid "The first active article in the category will be used for calculations." -msgstr "" -"Het eerste actieve artikel in de categorie wordt gebruikt voor berekeningen." +msgstr "Het eerste actieve artikel in de categorie wordt gebruikt voor berekeningen." #: amelie/personal_tab/models.py:358 msgid "Mifare Light" @@ -10680,8 +8021,7 @@ msgstr "Aanmaakdatum" msgid "RFID card" msgstr "Rfid-kaart" -#: amelie/personal_tab/models.py:380 -#: amelie/personal_tab/templates/info/rfid_cards.html:4 +#: amelie/personal_tab/models.py:380 amelie/personal_tab/templates/info/rfid_cards.html:4 msgid "RFID cards" msgstr "Rfid-kaarten" @@ -10745,8 +8085,7 @@ msgstr "einddatum" msgid "has been signed" msgstr "is getekend" -#: amelie/personal_tab/models.py:588 amelie/personal_tab/models.py:601 -#: amelie/personal_tab/models.py:757 +#: amelie/personal_tab/models.py:588 amelie/personal_tab/models.py:601 amelie/personal_tab/models.py:757 msgid "mandate" msgstr "machtiging" @@ -10775,9 +8114,7 @@ msgstr "opmerking" msgid "Amendment of %(authorization)s on %(date)s" msgstr "Amendement van %(authorization)s op %(date)s" -#: amelie/personal_tab/models.py:625 amelie/personal_tab/models.py:770 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:33 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:31 +#: amelie/personal_tab/models.py:625 amelie/personal_tab/models.py:770 amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:33 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:31 msgid "amendment" msgstr "amendement" @@ -10793,9 +8130,7 @@ msgstr "aangemaakt op" msgid "Direct withdrawal-task" msgstr "incasso-opdracht" -#: amelie/personal_tab/models.py:673 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:8 +#: amelie/personal_tab/models.py:673 amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:8 msgid "Direct withdrawal-tasks" msgstr "Incasso-opdrachten" @@ -10811,10 +8146,7 @@ msgstr "Geweigerd" msgid "Cancelled" msgstr "Geannuleerd" -#: amelie/personal_tab/models.py:692 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:49 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:105 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:114 +#: amelie/personal_tab/models.py:692 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:49 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:105 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:114 msgid "First collection" msgstr "Eerste incasso" @@ -10858,11 +8190,7 @@ msgstr "incasso-batches" msgid "batch" msgstr "batch" -#: amelie/personal_tab/models.py:760 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:117 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:18 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:93 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:50 +#: amelie/personal_tab/models.py:760 amelie/personal_tab/templates/cookie_corner_authorization_view.html:117 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:18 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:93 amelie/personal_tab/templates/cookie_corner_process_batch.html:50 msgid "end-to-end-id" msgstr "End-to-end-id" @@ -10884,21 +8212,15 @@ msgstr "verwerkingsdatum" #: amelie/personal_tab/models.py:837 msgid "Fill out processing date, not rent date. See Rabobank Internet Banking." -msgstr "" -"Vul hier de verwerkingsdatum in, niet de rentedatum. Zie Rabobank " -"Internetbankieren." +msgstr "Vul hier de verwerkingsdatum in, niet de rentedatum. Zie Rabobank Internetbankieren." #: amelie/personal_tab/models.py:840 msgid "pre-settlement" msgstr "pre-settlement" #: amelie/personal_tab/models.py:841 -msgid "" -"A debit reversal is pre-settlement when the withdrawal happens before the " -"crediting of the direct withdrawal has taken place." -msgstr "" -"Een terugboeking is pre-settlement als de afboeking gebeurt voordat de " -"bijschrijving van de incasso plaatsvindt." +msgid "A debit reversal is pre-settlement when the withdrawal happens before the crediting of the direct withdrawal has taken place." +msgstr "Een terugboeking is pre-settlement als de afboeking gebeurt voordat de bijschrijving van de incasso plaatsvindt." #: amelie/personal_tab/models.py:845 msgid "reason" @@ -10929,8 +8251,7 @@ msgstr "Registratietoken" msgid "Access for personal tab only." msgstr "Uitsluiten toegankelijk voor de streeplijst." -#: amelie/personal_tab/pos_views.py:67 amelie/personal_tab/pos_views.py:567 -#: amelie/personal_tab/pos_views.py:578 +#: amelie/personal_tab/pos_views.py:67 amelie/personal_tab/pos_views.py:567 amelie/personal_tab/pos_views.py:578 msgid "Something went wrong, please try again later." msgstr "Er ging iets fout, probeer het later opnieuw." @@ -10939,25 +8260,16 @@ msgid "No cards were scanned, please try again." msgstr "Er zijn geen kaarten gescand, probeer het opnieuw." #: amelie/personal_tab/pos_views.py:88 -msgid "" -"You do not have a valid mandate or are not a member anymore. Contact the " -"board for help." -msgstr "" -"Je hebt geen geldige machtiging of bent geen lid meer. Neem contact op met " -"het bestuur voor hulp." +msgid "You do not have a valid mandate or are not a member anymore. Contact the board for help." +msgstr "Je hebt geen geldige machtiging of bent geen lid meer. Neem contact op met het bestuur voor hulp." #: amelie/personal_tab/pos_views.py:91 -msgid "" -"RFID-cards from multiple people recognised. Please scan one card at a time." -msgstr "" -"RFID-kaarten van meerdere personen herkend. Scan alsjeblieft maar 1 kaart " -"tegelijkertijd." +msgid "RFID-cards from multiple people recognised. Please scan one card at a time." +msgstr "RFID-kaarten van meerdere personen herkend. Scan alsjeblieft maar 1 kaart tegelijkertijd." #: amelie/personal_tab/pos_views.py:98 msgid "Multiple unknown RFID-cards detected. Please scan one card at a time." -msgstr "" -"Meerdere onbekende RFID-kaarten gescand. Scan alsjeblieft maar 1 kaart " -"tegelijkertijd." +msgstr "Meerdere onbekende RFID-kaarten gescand. Scan alsjeblieft maar 1 kaart tegelijkertijd." #: amelie/personal_tab/pos_views.py:116 amelie/personal_tab/pos_views.py:228 msgid "Invalid token type requested." @@ -10973,38 +8285,27 @@ msgstr "Er is geen kaart gescand, probeer het opnieuw." #: amelie/personal_tab/pos_views.py:161 msgid "Something went wrong while scanning the RFID card. Please try again." -msgstr "" -"Er ging iets mis bij het scannen van de RFID-kaart. Probeer het opnieuw." +msgstr "Er ging iets mis bij het scannen van de RFID-kaart. Probeer het opnieuw." #: amelie/personal_tab/pos_views.py:168 amelie/personal_tab/pos_views.py:591 msgid "This card is already registered." msgstr "Deze kaart is al geregistreerd." #: amelie/personal_tab/pos_views.py:170 -msgid "" -"This card has already been registered, but has not been activated on the " -"website. Please contact the board." -msgstr "" -"Deze kaart is al geregistreerd, maar nog niet geactiveerd via de website. " -"Neem contact op met het bestuur." +msgid "This card has already been registered, but has not been activated on the website. Please contact the board." +msgstr "Deze kaart is al geregistreerd, maar nog niet geactiveerd via de website. Neem contact op met het bestuur." #: amelie/personal_tab/pos_views.py:190 msgid "This user is inactive. Please contact the board." msgstr "Deze gebruiker is inactief. Neem contact op met het bestuur." #: amelie/personal_tab/pos_views.py:194 amelie/personal_tab/register.py:33 -msgid "" -"You are (not yet/ no longer) a member of Inter-Actief. Ask the board for a " -"membership form." -msgstr "" -"Je bent (nog) geen lid (meer) van Inter-Actief. Vraag het bestuur om een " -"lidmaatschapsformulier." +msgid "You are (not yet/ no longer) a member of Inter-Actief. Ask the board for a membership form." +msgstr "Je bent (nog) geen lid (meer) van Inter-Actief. Vraag het bestuur om een lidmaatschapsformulier." #: amelie/personal_tab/pos_views.py:206 msgid "Card successfully registered. Please scan the card again to log in." -msgstr "" -" msgstr \"Kaart succesvol geregistreerd. Scan de kaart opnieuw om in te " -"loggen." +msgstr " msgstr \"Kaart succesvol geregistreerd. Scan de kaart opnieuw om in te loggen." #: amelie/personal_tab/pos_views.py:239 msgid "Invalid login token, please try again!" @@ -11048,36 +8349,27 @@ msgstr "Aankoop geannuleerd. Je bent nu uitgelogd." #: amelie/personal_tab/pos_views.py:390 msgid "No user was logged in. No products were purchased, please try again." -msgstr "" -"Er was geen gebruiker ingelogd. Er is niks gekocht, probeer het opnieuw." +msgstr "Er was geen gebruiker ingelogd. Er is niks gekocht, probeer het opnieuw." #: amelie/personal_tab/pos_views.py:394 -msgid "" -"Invalid shopping cart. No products are bought. Please try again. (error 1)" -msgstr "" -"Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 1)" +msgid "Invalid shopping cart. No products are bought. Please try again. (error 1)" +msgstr "Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 1)" #: amelie/personal_tab/pos_views.py:407 msgid "No products were selected. Please try again." msgstr "Er zijn geen producten geselecteerd. Probeer het opnieuw." #: amelie/personal_tab/pos_views.py:412 -msgid "" -"Invalid shopping cart. No products are bought. Please try again. (error 2)" -msgstr "" -"Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 2)" +msgid "Invalid shopping cart. No products are bought. Please try again. (error 2)" +msgstr "Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 2)" #: amelie/personal_tab/pos_views.py:418 -msgid "" -"Invalid shopping cart. No products are bought. Please try again. (error 3)" -msgstr "" -"Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 3)" +msgid "Invalid shopping cart. No products are bought. Please try again. (error 3)" +msgstr "Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 3)" #: amelie/personal_tab/pos_views.py:422 -msgid "" -"Invalid shopping cart. No products are bought. Please try again. (error 4)" -msgstr "" -"Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 4)" +msgid "Invalid shopping cart. No products are bought. Please try again. (error 4)" +msgstr "Ongeldig winkelmandje. Er is niks gekocht. Probeer het opnieuw. (error 4)" #: amelie/personal_tab/pos_views.py:448 msgid "Purchase registered!" @@ -11096,12 +8388,8 @@ msgid "This person is (not) a member of Inter-Actief (anymore)." msgstr "Deze persoon is (nog) geen lid (meer) van Inter-Actief." #: amelie/personal_tab/pos_views.py:537 -msgid "" -"You are not a board member of Inter-Actief. Ask the board to register your " -"card." -msgstr "" -"Je bent geen bestuurder van Inter-Actief. Vraag het bestuur je kaart te " -"registreren." +msgid "You are not a board member of Inter-Actief. Ask the board to register your card." +msgstr "Je bent geen bestuurder van Inter-Actief. Vraag het bestuur je kaart te registreren." #: amelie/personal_tab/pos_views.py:560 msgid "You have been logged out. No card was registered. Please try again" @@ -11112,12 +8400,8 @@ msgid "Card successfully registered. You have been logged out." msgstr "Kaart succesvol geregistreerd. Je bent uitgelogd." #: amelie/personal_tab/pos_views.py:601 -msgid "" -"Multiple unknown RFID-cards detected. Please scan one card at a time. You " -"have been logged out." -msgstr "" -"Meerdere onbekende RFID-kaarten gescand. Scan alsjeblieft 1 kaart " -"tegelijkertijd. Je bent uitgelogd." +msgid "Multiple unknown RFID-cards detected. Please scan one card at a time. You have been logged out." +msgstr "Meerdere onbekende RFID-kaarten gescand. Scan alsjeblieft 1 kaart tegelijkertijd. Je bent uitgelogd." #: amelie/personal_tab/register.py:22 msgid "Username and password are obligatory" @@ -11143,22 +8427,15 @@ msgstr "Kaart is geregistreerd." msgid "{} ledger statistics" msgstr "{} grootboekstatistieken" -#: amelie/personal_tab/statistics.py:283 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:52 -#: amelie/personal_tab/templates/cookie_corner_statistics_form.html:4 -#: amelie/personal_tab/templates/cookie_corner_statistics_form.html:9 +#: amelie/personal_tab/statistics.py:283 amelie/personal_tab/templates/cookie_corner_statistics.html:52 amelie/personal_tab/templates/cookie_corner_statistics_form.html:4 amelie/personal_tab/templates/cookie_corner_statistics_form.html:9 msgid "Personal tab statistics" msgstr "Streeplijststatistieken" -#: amelie/personal_tab/statistics.py:284 -#: amelie/personal_tab/templates/cookie_corner_balance_form.html:4 -#: amelie/personal_tab/templates/cookie_corner_balance_form.html:9 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:100 +#: amelie/personal_tab/statistics.py:284 amelie/personal_tab/templates/cookie_corner_balance_form.html:4 amelie/personal_tab/templates/cookie_corner_balance_form.html:9 amelie/personal_tab/templates/cookie_corner_statistics.html:100 msgid "Personal tab balance" msgstr "Streeplijst totalen" -#: amelie/personal_tab/statistics.py:286 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:235 +#: amelie/personal_tab/statistics.py:286 amelie/personal_tab/templates/cookie_corner_statistics.html:235 msgid "Alexia transactions" msgstr "Alexiatransacties" @@ -11166,13 +8443,11 @@ msgstr "Alexiatransacties" msgid "Contribution transactions" msgstr "Contributietransacties" -#: amelie/personal_tab/statistics.py:288 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:407 +#: amelie/personal_tab/statistics.py:288 amelie/personal_tab/templates/cookie_corner_statistics.html:407 msgid "Discount offers" msgstr "Kortingsacties" -#: amelie/personal_tab/statistics.py:289 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:373 +#: amelie/personal_tab/statistics.py:289 amelie/personal_tab/templates/cookie_corner_statistics.html:373 msgid "Discount balances" msgstr "Kortingstegoeden" @@ -11180,23 +8455,11 @@ msgstr "Kortingstegoeden" msgid "Custom transactions" msgstr "Overige transacties" -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:4 -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:8 -#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:4 -#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:8 -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:4 -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:8 -#: amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:4 -#: amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:8 -#: amelie/personal_tab/templates/cookie_corner/transaction_delete.html:4 -#: amelie/personal_tab/templates/cookie_corner/transaction_detail.html:4 -#: amelie/personal_tab/templates/cookie_corner/transaction_detail.html:8 +#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:4 amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:8 amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:4 amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:8 amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:4 amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:8 amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:4 amelie/personal_tab/templates/cookie_corner/reversal_transaction_detail.html:8 amelie/personal_tab/templates/cookie_corner/transaction_delete.html:4 amelie/personal_tab/templates/cookie_corner/transaction_detail.html:4 amelie/personal_tab/templates/cookie_corner/transaction_detail.html:8 msgid "Transaction information" msgstr "Transactiegegevens" -#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:23 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:209 -#: amelie/personal_tab/templates/lists/activity_transactions.html:41 +#: amelie/personal_tab/templates/cookie_corner/activity_transaction_detail.html:23 amelie/personal_tab/templates/cookie_corner_statistics.html:209 amelie/personal_tab/templates/lists/activity_transactions.html:41 msgid "Deleted event" msgstr "Verwijderd event" @@ -11212,8 +8475,7 @@ msgstr "Transactienummer Alexia" msgid "Purchases" msgstr "Aankopen" -#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:30 -#: amelie/personal_tab/templates/pos/success.html:33 +#: amelie/personal_tab/templates/cookie_corner/alexia_transaction_detail.html:30 amelie/personal_tab/templates/pos/success.html:33 msgid "Product" msgstr "Product" @@ -11225,22 +8487,15 @@ msgstr "Geen aankopen." msgid "It was not possible to retrieve the transaction details." msgstr "Het was niet mogelijk de transactiedetails op te halen." -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:4 -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:9 -#: amelie/personal_tab/templates/cookie_corner_overview.html:24 +#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:4 amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:9 amelie/personal_tab/templates/cookie_corner_overview.html:24 msgid "Anonymize old mandates" msgstr "Oude machtigingen anonimiseren" #: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:12 -msgid "" -"The following mandates are no longer actively used and can be anonymized." -msgstr "" -"Onderstaande machtigingen worden niet meer gebruikt en kunnen geanonimiseerd " -"worden." +msgid "The following mandates are no longer actively used and can be anonymized." +msgstr "Onderstaande machtigingen worden niet meer gebruikt en kunnen geanonimiseerd worden." -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:15 -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:15 -#: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:15 +#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize.html:15 amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:15 amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:15 msgid "Number of mandates" msgstr "Aantal machtigingen" @@ -11248,47 +8503,35 @@ msgstr "Aantal machtigingen" msgid "Anonymize mandates" msgstr "Machtigingen anonimiseren" -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:4 -#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:9 +#: amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:4 amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:9 msgid "Old mandates anonymized" msgstr "Oude machtigingen geanonimiseerd" #: amelie/personal_tab/templates/cookie_corner/authorization_anonymize_success.html:12 -msgid "" -"The following mandates are anonymized and their paper version can be " -"destroyed." -msgstr "" -"Onderstaande machtigingen zijn geanonimiseerd en de papieren versies kunnen " -"daarom geshred worden." +msgid "The following mandates are anonymized and their paper version can be destroyed." +msgstr "Onderstaande machtigingen zijn geanonimiseerd en de papieren versies kunnen daarom geshred worden." -#: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:4 -#: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:9 -#: amelie/personal_tab/templates/cookie_corner_overview.html:23 +#: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:4 amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:9 amelie/personal_tab/templates/cookie_corner_overview.html:23 msgid "End inactive mandates" msgstr "Inactieve machtigingen beëindigen" #: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:12 msgid "The following mandates are no longer actively used and can be ended." -msgstr "" -"Onderstaande machtigingen worden niet meer actief gebruikt en kunnen " -"beëindigd worden." +msgstr "Onderstaande machtigingen worden niet meer actief gebruikt en kunnen beëindigd worden." #: amelie/personal_tab/templates/cookie_corner/authorization_terminate.html:24 msgid "End mandates" msgstr "Machtigingen beëindigen" -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:28 -#: amelie/personal_tab/templates/cookie_corner/transaction_detail.html:16 +#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:28 amelie/personal_tab/templates/cookie_corner/transaction_detail.html:16 msgid "Edit transaction" msgstr "Transactie wijzigen" -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:29 -#: amelie/personal_tab/templates/cookie_corner/transaction_detail.html:17 +#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:29 amelie/personal_tab/templates/cookie_corner/transaction_detail.html:17 msgid "Delete transaction" msgstr "Verwijder transactie" -#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:31 -#: amelie/personal_tab/templates/cookie_corner/transaction_detail.html:19 +#: amelie/personal_tab/templates/cookie_corner/cookie_corner_transaction_detail.html:31 amelie/personal_tab/templates/cookie_corner/transaction_detail.html:19 msgid "This transaction is not editable as it has already been debited." msgstr "De transactie is niet aan te passen omdat deze al geïncasseerd is." @@ -11305,15 +8548,13 @@ msgstr "Verwijder transactie '%(object)s'" #, python-format msgid "" "\n" -" Are you sure you want to delete '%(object)s' for " -"%(person)s?\n" +" Are you sure you want to delete '%(object)s' for %(person)s?\n" " " msgstr "" "\n" "Weet je zeker dat je '%(object)s' van %(person)s wilt verwijderen?" -#: amelie/personal_tab/templates/cookie_corner/transaction_form.html:5 -#: amelie/personal_tab/templates/cookie_corner/transaction_form.html:13 +#: amelie/personal_tab/templates/cookie_corner/transaction_form.html:5 amelie/personal_tab/templates/cookie_corner/transaction_form.html:13 msgid "Add transaction" msgstr "Transactie toevoegen" @@ -11330,9 +8571,7 @@ msgstr "Je voegt nu een streeplijsttransactie toe" msgid "You are now adding a transaction in the category \"Other\"" msgstr "Je voegt nu een overige transactie toe" -#: amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:4 -#: amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:9 -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:100 +#: amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:4 amelie/personal_tab/templates/cookie_corner_authorization_amendment.html:9 amelie/personal_tab/templates/cookie_corner_authorization_view.html:100 msgid "Add amendment" msgstr "Amendement invoeren" @@ -11340,31 +8579,25 @@ msgstr "Amendement invoeren" #, python-format msgid "" "\n" -" With this form, you can add a debit reversal of " -"direct withdrawal-instruction %(authorization)s.\n" +" With this form, you can add a debit reversal of direct withdrawal-instruction %(authorization)s.\n" " " msgstr "" "\n" -"Met dit formulier kun je een amendement invoeren voor machtiging %(authorization)s." +"Met dit formulier kun je een amendement invoeren voor machtiging %(authorization)s." #: amelie/personal_tab/templates/cookie_corner_authorization_list.html:8 msgid "Search mandates for collection" msgstr "Machtigingen zoeken" -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:68 -#: amelie/personal_tab/templates/lists/authorization_select.html:12 +#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:68 amelie/personal_tab/templates/lists/authorization_select.html:12 msgid "Person/account holder" msgstr "Persoon/rekeninghouder" -#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:103 -#: amelie/personal_tab/templates/info/account_information.html:40 -#: amelie/personal_tab/templates/lists/authorization_select.html:44 +#: amelie/personal_tab/templates/cookie_corner_authorization_list.html:103 amelie/personal_tab/templates/info/account_information.html:40 amelie/personal_tab/templates/lists/authorization_select.html:44 msgid "(not yet) active" msgstr "(nog) niet actief" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:13 -#: amelie/tools/pdf.py:370 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:13 amelie/tools/pdf.py:370 msgid "Mandate reference" msgstr "Machtigingskenmerk" @@ -11372,18 +8605,15 @@ msgstr "Machtigingskenmerk" msgid "Amendments" msgstr "Amendementen" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:67 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:113 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:67 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:113 msgid "Previous IBAN" msgstr "Vorige IBAN" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:68 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:117 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:68 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:117 msgid "Previous BIC" msgstr "Vorige BIC" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:69 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:121 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:69 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:121 msgid "Other bank" msgstr "Andere bank" @@ -11407,23 +8637,15 @@ msgstr "Instructies" msgid "Task/batch" msgstr "Opdracht/batch" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:119 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:75 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:104 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:94 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:51 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:119 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:75 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:104 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:94 amelie/personal_tab/templates/cookie_corner_process_batch.html:51 msgid "Amendment" msgstr "Amendement" -#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:153 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:138 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:95 +#: amelie/personal_tab/templates/cookie_corner_authorization_view.html:153 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:138 amelie/personal_tab/templates/cookie_corner_process_batch.html:95 msgid "No instructions have been found." msgstr "Er zijn geen instructies gevonden." -#: amelie/personal_tab/templates/cookie_corner_balance.html:5 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:11 -#: amelie/personal_tab/templates/exports/screen.html:4 +#: amelie/personal_tab/templates/cookie_corner_balance.html:5 amelie/personal_tab/templates/cookie_corner_statistics.html:11 amelie/personal_tab/templates/exports/screen.html:4 msgid "Result" msgstr "Resultaat" @@ -11431,24 +8653,15 @@ msgstr "Resultaat" msgid "Balance date:" msgstr "Balansdatum:" -#: amelie/personal_tab/templates/cookie_corner_balance.html:16 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:35 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:64 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:110 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:151 -#: amelie/personal_tab/templates/exports/screen.html:25 +#: amelie/personal_tab/templates/cookie_corner_balance.html:16 amelie/personal_tab/templates/cookie_corner_statistics.html:35 amelie/personal_tab/templates/cookie_corner_statistics.html:64 amelie/personal_tab/templates/cookie_corner_statistics.html:110 amelie/personal_tab/templates/cookie_corner_statistics.html:151 amelie/personal_tab/templates/exports/screen.html:25 msgid "Total costs" msgstr "Totaal bedrag" -#: amelie/personal_tab/templates/cookie_corner_balance.html:20 -#: amelie/personal_tab/templates/cookie_corner_balance.html:57 +#: amelie/personal_tab/templates/cookie_corner_balance.html:20 amelie/personal_tab/templates/cookie_corner_balance.html:57 msgid "Exam credits" msgstr "Tentamenkoekentegoed" -#: amelie/personal_tab/templates/cookie_corner_balance.html:36 -#: amelie/personal_tab/templates/cookie_corner_balance.html:64 -#: amelie/personal_tab/templates/cookie_corner_balance_form.html:20 -#: amelie/personal_tab/templates/cookie_corner_overview.html:20 +#: amelie/personal_tab/templates/cookie_corner_balance.html:36 amelie/personal_tab/templates/cookie_corner_balance.html:64 amelie/personal_tab/templates/cookie_corner_balance_form.html:20 amelie/personal_tab/templates/cookie_corner_overview.html:20 msgid "Balance" msgstr "Saldo" @@ -11456,49 +8669,39 @@ msgstr "Saldo" msgid "Select a period and click Balance." msgstr "Selecteer een periode en klik op Balans." -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:4 -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:9 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:4 amelie/personal_tab/templates/cookie_corner_dashboard.html:9 #, python-format msgid "Cookie and candy list of %(person)s" msgstr "Streeplijst van %(person)s" #: amelie/personal_tab/templates/cookie_corner_dashboard.html:13 #, python-format -msgid "" -"Your current balance is € %(curr_balance)s. Including future " -"transactions that will be € %(all_balance)s." +msgid "Your current balance is € %(curr_balance)s. Including future transactions that will be € %(all_balance)s." msgstr "" "Je huidige streeplijstsaldo is € %(curr_balance)s,\n" -" met toekomstige transacties meegerekend is dat € " -"%(all_balance)s." +" met toekomstige transacties meegerekend is dat € %(all_balance)s." #: amelie/personal_tab/templates/cookie_corner_dashboard.html:16 #, python-format msgid "" "\n" -" On %(date)s, € %(amount)s " -"will be withdrawn from your bank account.\n" +" On %(date)s, € %(amount)s will be withdrawn from your bank account.\n" " " msgstr "" "\n" -"Er wordt op %(date)s € %(amount)s geincasseerd " -"van je rekening." +"Er wordt op %(date)s € %(amount)s geincasseerd van je rekening." #: amelie/personal_tab/templates/cookie_corner_dashboard.html:23 #, python-format msgid "" "\n" -" Because you have submitted an exam paper, you may " -"spend %(credit)s on consumptions.\n" +" Because you have submitted an exam paper, you may spend %(credit)s on consumptions.\n" " " msgstr "" "\n" -"Omdat je tentamens hebt ingeleverd, mag je nog voor %(credit)s aan koeken " -"kopen." +"Omdat je tentamens hebt ingeleverd, mag je nog voor %(credit)s aan koeken kopen." -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:38 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:26 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:37 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:38 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:26 amelie/personal_tab/templates/cookie_corner_transactions_new.html:37 msgid "No transactions have been found" msgstr "Er zijn geen transacties gevonden." @@ -11512,19 +8715,15 @@ msgstr "" "\n" "Laatste %(amount)s toegevoegde transacties." -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:49 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:45 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:49 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:45 msgid "Previous transactions" msgstr "Eerdere transacties" -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:52 -#: amelie/personal_tab/templates/info/exam_cookie_credit.html:18 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:52 amelie/personal_tab/templates/info/exam_cookie_credit.html:18 msgid "History of exam credit" msgstr "Geschiedenis tentamentegoed" -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:55 -#: amelie/personal_tab/templates/wrapped.html:4 -#: amelie/personal_tab/templates/wrapped_no_transactions.html:4 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:55 amelie/personal_tab/templates/wrapped.html:4 amelie/personal_tab/templates/wrapped_no_transactions.html:4 msgid "Cookie Corner Wrapped" msgstr "Cookie Corner Wrapped" @@ -11536,16 +8735,11 @@ msgstr "Streeplijsttransactie toevoegen" msgid "Add other transaction" msgstr "Overige transactie toevoegen" -#: amelie/personal_tab/templates/cookie_corner_dashboard.html:69 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:54 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit_add.html:5 -#: amelie/personal_tab/templates/info/exam_cookie_credit.html:22 +#: amelie/personal_tab/templates/cookie_corner_dashboard.html:69 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:54 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit_add.html:5 amelie/personal_tab/templates/info/exam_cookie_credit.html:22 msgid "Add credit for exams" msgstr "Tentamenkoekentegoed toevoegen" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:8 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:95 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_reversal.html:8 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:95 msgid "Insert reversal" msgstr "Terugboeking invoeren" @@ -11553,16 +8747,13 @@ msgstr "Terugboeking invoeren" #, python-format msgid "" "\n" -" With this form, you can add a debit reversal of direct " -"withdrawal-instruction %(instruction)s.\n" +" With this form, you can add a debit reversal of direct withdrawal-instruction %(instruction)s.\n" " " msgstr "" "\n" -"Met dit formulier kun je een terugboeking invoeren van incasso-instructie %(instruction)s." +"Met dit formulier kun je een terugboeking invoeren van incasso-instructie %(instruction)s." -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:8 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:8 msgid "Direct withdrawal-instruction" msgstr "Incasso-instructie" @@ -11570,10 +8761,7 @@ msgstr "Incasso-instructie" msgid "Reference of direct withdrawal" msgstr "Incassoreferentie" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:49 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:8 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:4 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:49 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:8 amelie/personal_tab/templates/cookie_corner_process_batch.html:4 msgid "direct withdrawal-task" msgstr "Incasso-opdracht" @@ -11585,8 +8773,7 @@ msgstr "Incasso-batch" msgid "no" msgstr "nee" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:86 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:136 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:86 amelie/personal_tab/templates/cookie_corner_debt_collection_instruction_view.html:136 msgid "Debit reversal" msgstr "Terugboeking" @@ -11594,9 +8781,7 @@ msgstr "Terugboeking" msgid "Pre-settlement" msgstr "Pre-settlement" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:12 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:10 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:12 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:10 msgid "Create collection" msgstr "Incasso-opdracht aanmaken" @@ -11604,14 +8789,11 @@ msgstr "Incasso-opdracht aanmaken" msgid "Identification" msgstr "Identificatie" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:21 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:17 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:25 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_list.html:21 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:17 amelie/weekmail/templates/weekmail/weekmail_wizard.html:25 msgid "Created on" msgstr "Aanmaakdatum" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_mailing.html:4 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_mailing.html:8 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_mailing.html:4 amelie/personal_tab/templates/cookie_corner_debt_collection_mailing.html:8 msgid "Send collection mailing" msgstr "Incassomailing versturen" @@ -11635,8 +8817,7 @@ msgstr "Deze opdracht bevat geen streeplijstincasso's." #, python-format msgid "" "\n" -" The first possible date of execution is " -"%(minimal_execution_date)s.\n" +" The first possible date of execution is %(minimal_execution_date)s.\n" " " msgstr "" "\n" @@ -11650,26 +8831,19 @@ msgstr "Voorstel maken" msgid "Direct withdrawal of membership fees" msgstr "Contributie-incasso's" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:36 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:80 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:36 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:80 msgid "Ongoing first attempt at direct withdrawal" msgstr "Lopende eerste incassopoging" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:38 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:82 -msgid "" -"People with an ongoing first attempt at direct withdrawal will NOT be " -"withdrawn from." +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:38 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:82 +msgid "People with an ongoing first attempt at direct withdrawal will NOT be withdrawn from." msgstr "Personen met lopende eerste incassopoging worden NIET incasseerd." -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:41 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:85 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:41 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:85 msgid "" "\n" -" The first attempt at collection of the " -"belowmentioned people has not yet been processed.\n" -" They cannot be collected until the first attempt has " -"been processed.\n" +" The first attempt at collection of the belowmentioned people has not yet been processed.\n" +" They cannot be collected until the first attempt has been processed.\n" " " msgstr "" "\n" @@ -11677,9 +8851,7 @@ msgstr "" "verwerkt. Deze kunnen niet geincasseerd worden voordat de\n" "eerste incassopoging verwerkt is." -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:52 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:109 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:117 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:52 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:109 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:117 msgid "Follow-up direct withdrawal" msgstr "Vervolgincasso" @@ -11687,8 +8859,7 @@ msgstr "Vervolgincasso" msgid "Direct withdrawal of personal tabs" msgstr "Streeplijstincasso's" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:64 -#: amelie/personal_tab/templates/exports/screen.html:38 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:64 amelie/personal_tab/templates/exports/screen.html:38 msgid "Negative balance" msgstr "Negatief saldo" @@ -11701,13 +8872,10 @@ msgid "No mandate" msgstr "Geen machtiging" #: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:74 -msgid "" -"People who have not signed a direct debit mandate will NOT be withdrawn from." +msgid "People who have not signed a direct debit mandate will NOT be withdrawn from." msgstr "Personen zonder machtiging worden NIET incasseerd." -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:94 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:105 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:109 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:94 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:105 amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:109 msgid "Mandate has ended" msgstr "Beëindigde machtiging" @@ -11718,8 +8886,7 @@ msgstr "Er zijn personen met een beëindigde machtiging." #: amelie/personal_tab/templates/cookie_corner_debt_collection_new.html:99 msgid "" "\n" -" The people listed below used to have a mandate, but " -"have had it canceled.\n" +" The people listed below used to have a mandate, but have had it canceled.\n" " You can still add them to a collection instruction.\n" " " msgstr "" @@ -11732,23 +8899,15 @@ msgstr "" msgid "File identification" msgstr "Bestandsidentificatie" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:25 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:68 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:28 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:25 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:68 amelie/personal_tab/templates/cookie_corner_process_batch.html:28 msgid "Number of transactions" msgstr "Aantal transacties" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:29 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:72 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:29 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:72 msgid "Total reversed" msgstr "Totaal gestorneerd" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:33 -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:76 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:32 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:63 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:109 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:150 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:33 amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:76 amelie/personal_tab/templates/cookie_corner_process_batch.html:32 amelie/personal_tab/templates/cookie_corner_statistics.html:63 amelie/personal_tab/templates/cookie_corner_statistics.html:109 amelie/personal_tab/templates/cookie_corner_statistics.html:150 msgid "Total cost" msgstr "Totaalbedrag" @@ -11756,13 +8915,11 @@ msgstr "Totaalbedrag" msgid "Export direct withdrawal-file" msgstr "Incassobestand exporteren" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:56 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:16 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:56 amelie/personal_tab/templates/cookie_corner_process_batch.html:16 msgid "Number of reference" msgstr "Referentienummer" -#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:64 -#: amelie/personal_tab/templates/cookie_corner_process_batch.html:24 +#: amelie/personal_tab/templates/cookie_corner_debt_collection_view.html:64 amelie/personal_tab/templates/cookie_corner_process_batch.html:24 msgid "Sequence type" msgstr "Sequence type" @@ -11774,14 +8931,11 @@ msgstr "Geen batches" msgid "No batches have been found." msgstr "Er zijn geen batches gevonden." -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:4 -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:9 -#: amelie/personal_tab/templates/cookie_corner_overview.html:18 +#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:4 amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:9 amelie/personal_tab/templates/cookie_corner_overview.html:18 msgid "Exam credit transactions" msgstr "Transacties tentamenkoekentegoed" -#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:21 -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:21 +#: amelie/personal_tab/templates/cookie_corner_exam_cookie_credit.html:21 amelie/personal_tab/templates/cookie_corner_transactions_new.html:21 msgid "Show overview" msgstr "Overzicht tonen" @@ -11813,9 +8967,7 @@ msgstr "" "\n" "Tentamenkoekentegoed toevoegen voor %(person)s" -#: amelie/personal_tab/templates/cookie_corner_export_form.html:4 -#: amelie/personal_tab/templates/cookie_corner_export_form.html:9 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:43 +#: amelie/personal_tab/templates/cookie_corner_export_form.html:4 amelie/personal_tab/templates/cookie_corner_export_form.html:9 amelie/personal_tab/templates/cookie_corner_statistics.html:43 msgid "Export list of direct withdrawals" msgstr "Incassolijst exporteren" @@ -11831,8 +8983,7 @@ msgstr "Exporteren" msgid "Personal overview" msgstr "Persoonlijk overzicht" -#: amelie/personal_tab/templates/cookie_corner_overview.html:16 -#: amelie/personal_tab/templates/price_list.html:8 +#: amelie/personal_tab/templates/cookie_corner_overview.html:16 amelie/personal_tab/templates/price_list.html:8 msgid "Price list" msgstr "Prijslijst" @@ -11852,8 +9003,7 @@ msgstr "Verouderde pagina's" msgid "Export list of direct withdrawals (ClieOp)" msgstr "Incassolijst exporteren (ClieOp)" -#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:4 -#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:8 +#: amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:4 amelie/personal_tab/templates/cookie_corner_person_debt_collection_instructions.html:8 #, python-format msgid "Direct debit for %(person)s" msgstr "Incasso's voor %(person)s" @@ -11862,18 +9012,11 @@ msgstr "Incasso's voor %(person)s" msgid "No direct debits have been found." msgstr "Er zijn geen incasso's gevonden." -#: amelie/personal_tab/templates/cookie_corner_statistics.html:23 -#: amelie/personal_tab/templates/exports/screen.html:13 +#: amelie/personal_tab/templates/cookie_corner_statistics.html:23 amelie/personal_tab/templates/exports/screen.html:13 msgid "End date (till)" msgstr "Einddatum (tot):" -#: amelie/personal_tab/templates/cookie_corner_statistics.html:189 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:324 -#: amelie/personal_tab/templates/lists/alexia_transactions.html:9 -#: amelie/personal_tab/templates/lists/cookie_corner_transactions.html:9 -#: amelie/personal_tab/templates/lists/custom_transactions.html:9 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:9 -#: amelie/personal_tab/templates/lists/transactions.html:9 +#: amelie/personal_tab/templates/cookie_corner_statistics.html:189 amelie/personal_tab/templates/cookie_corner_statistics.html:324 amelie/personal_tab/templates/lists/alexia_transactions.html:9 amelie/personal_tab/templates/lists/cookie_corner_transactions.html:9 amelie/personal_tab/templates/lists/custom_transactions.html:9 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:9 amelie/personal_tab/templates/lists/transactions.html:9 msgid "Time" msgstr "Tijd" @@ -11881,9 +9024,7 @@ msgstr "Tijd" msgid "Drink" msgstr "Borrel" -#: amelie/personal_tab/templates/cookie_corner_statistics.html:379 -#: amelie/personal_tab/templates/cookie_corner_statistics.html:414 -#: amelie/personal_tab/templates/info/transaction_information.html:29 +#: amelie/personal_tab/templates/cookie_corner_statistics.html:379 amelie/personal_tab/templates/cookie_corner_statistics.html:414 amelie/personal_tab/templates/info/transaction_information.html:29 msgid "Discount offer" msgstr "Kortingsactie" @@ -11896,8 +9037,7 @@ msgstr "Er zijn statistieken om te laten zien." msgid "from %(date_from)s till %(date_to)s" msgstr "van %(date_from)s tot %(date_to)s" -#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:45 -#: amelie/personal_tab/templates/lists/transactions_totals.html:23 +#: amelie/personal_tab/templates/cookie_corner_transactions_new.html:45 amelie/personal_tab/templates/lists/transactions_totals.html:23 msgid "Alexia" msgstr "Alexia" @@ -11925,27 +9065,17 @@ msgstr "Personen met negative saldo worden NIET geëxporteerd." msgid "No people with a negative balance." msgstr "Geen personen met negatief saldo." -#: amelie/personal_tab/templates/exports/screen.html:89 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:59 -#: amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:46 -#: amelie/personal_tab/templates/lists/transactions.html:53 -#: amelie/personal_tab/templates/lists/transactions_totals.html:67 +#: amelie/personal_tab/templates/exports/screen.html:89 amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:59 amelie/personal_tab/templates/lists/exam_cookie_credit_transactions.html:46 amelie/personal_tab/templates/lists/transactions.html:53 amelie/personal_tab/templates/lists/transactions_totals.html:67 msgid "No transactions" msgstr "Geen transacties" #: amelie/personal_tab/templates/info/account_information.html:55 msgid "To change or end your direct debit mandate, please contact the board." -msgstr "" -"Voor het wijzigen of beëindigen van je machtiging kun je contact opnemen met " -"het bestuur." +msgstr "Voor het wijzigen of beëindigen van je machtiging kun je contact opnemen met het bestuur." #: amelie/personal_tab/templates/info/account_information.html:57 -msgid "" -"You have not yet signed a direct debit mandate. You can ask the board for " -"one." -msgstr "" -"Je hebt nog geen machtiging ingevuld. Je kunt het bestuur om een machtiging " -"vragen." +msgid "You have not yet signed a direct debit mandate. You can ask the board for one." +msgstr "Je hebt nog geen machtiging ingevuld. Je kunt het bestuur om een machtiging vragen." #: amelie/personal_tab/templates/info/debt_collection_instructions.html:4 msgid "Direct debits" @@ -11977,13 +9107,11 @@ msgstr "Tentamenkoeken" #, python-format msgid "" "\n" -" Because you have submitted an exam paper, you may spend " -"%(credit)s on consumptions.\n" +" Because you have submitted an exam paper, you may spend %(credit)s on consumptions.\n" " " msgstr "" "\n" -"Omdat je tentamens hebt ingeleverd, mag je nog voor %(credit)s aan koeken " -"kopen." +"Omdat je tentamens hebt ingeleverd, mag je nog voor %(credit)s aan koeken kopen." #: amelie/personal_tab/templates/info/exam_cookie_credit.html:14 msgid "You have no exam credit." @@ -12033,29 +9161,24 @@ msgstr "Geen streeplijsttransacties." msgid "No other transactions." msgstr "Geen overige transacties." -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:8 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:8 +#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:8 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:8 msgid "Collect" msgstr "Incasseren" -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:33 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:31 +#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:33 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:31 msgctxt "amendment abbr" msgid "A " msgstr "A " -#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:60 -#: amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:57 +#: amelie/personal_tab/templates/lists/debt_collection_proposal_contribution.html:60 amelie/personal_tab/templates/lists/debt_collection_proposal_cookie_corner.html:57 msgid "There are no collections in this category." msgstr "Er zijn geen incasso's in deze categorie." -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:10 -#: amelie/personal_tab/templates/lists/transactions_totals.html:10 +#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:10 amelie/personal_tab/templates/lists/transactions_totals.html:10 msgid "Month" msgstr "Maand" -#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:14 -#: amelie/personal_tab/templates/lists/transactions_totals.html:14 +#: amelie/personal_tab/templates/lists/exam_cookie_credit_totals.html:14 amelie/personal_tab/templates/lists/transactions_totals.html:14 msgid "Day" msgstr "Dag" @@ -12079,13 +9202,7 @@ msgstr "Scan uw kaart" msgid "Or press here to log in" msgstr "Of tik hier om in te loggen" -#: amelie/personal_tab/templates/pos/home.html:18 -#: amelie/personal_tab/templates/pos/register_external_card.html:19 -#: amelie/personal_tab/templates/pos/scan_external_card.html:13 -#: amelie/personal_tab/templates/pos/shop.html:9 -#: amelie/personal_tab/templates/pos/show_qr.html:13 -#: amelie/personal_tab/templates/pos/success.html:19 -#: amelie/personal_tab/templates/pos/verify.html:8 +#: amelie/personal_tab/templates/pos/home.html:18 amelie/personal_tab/templates/pos/register_external_card.html:19 amelie/personal_tab/templates/pos/scan_external_card.html:13 amelie/personal_tab/templates/pos/shop.html:9 amelie/personal_tab/templates/pos/show_qr.html:13 amelie/personal_tab/templates/pos/success.html:19 amelie/personal_tab/templates/pos/verify.html:8 msgid "THIS COOKIE CORNER IS RUNNING IN BETA MODE. PLEASE DO NOT BUY ANYTHING." msgstr "DEZE COOKIE CORNER DRAAIT IN BETA MODUS. AUB NIKS KOPEN." @@ -12131,8 +9248,7 @@ msgstr "Afgelopen Activiteiten" msgid "No pictures of past activities found!" msgstr "Geen fotos van afgelopen activiteiten gevonden!" -#: amelie/personal_tab/templates/pos/home.html:119 -#: amelie/personal_tab/templates/pos/home.html:130 +#: amelie/personal_tab/templates/pos/home.html:119 amelie/personal_tab/templates/pos/home.html:130 msgid "Weather" msgstr "Weer" @@ -12140,10 +9256,7 @@ msgstr "Weer" msgid "Enschede" msgstr "Enschede" -#: amelie/personal_tab/templates/pos/register_external_card.html:16 -#: amelie/personal_tab/templates/pos/scan_external_card.html:10 -#: amelie/personal_tab/templates/pos/show_qr.html:10 -#: amelie/personal_tab/templates/pos/success.html:16 +#: amelie/personal_tab/templates/pos/register_external_card.html:16 amelie/personal_tab/templates/pos/scan_external_card.html:10 amelie/personal_tab/templates/pos/show_qr.html:10 amelie/personal_tab/templates/pos/success.html:16 msgid "Return to home" msgstr "Terug naar hoofdpagina" @@ -12180,8 +9293,7 @@ msgstr "Voer aub het aantal in..." msgid "In shopping cart" msgstr "In winkelmand" -#: amelie/personal_tab/templates/pos/shop.html:50 -#: amelie/personal_tab/templates/pos/shop.html:88 +#: amelie/personal_tab/templates/pos/shop.html:50 amelie/personal_tab/templates/pos/shop.html:88 msgid "Insta-buy" msgstr "Insta-buy" @@ -12219,9 +9331,7 @@ msgstr "Winkelmandje" msgid "And {amount} more articles..." msgstr "En nog {amount} andere artikelen..." -#: amelie/personal_tab/templates/pos/show_qr.html:19 -#: amelie/personal_tab/templates/register/register_card_index.html:28 -#: templates/basis.html:268 templates/login.html:4 templates/login.html:47 +#: amelie/personal_tab/templates/pos/show_qr.html:19 amelie/personal_tab/templates/register/register_card_index.html:28 templates/basis.html:268 templates/login.html:4 templates/login.html:47 msgid "Log in" msgstr "Inloggen" @@ -12229,8 +9339,7 @@ msgstr "Inloggen" msgid "Register new RFID card" msgstr "Registreer nieuwe RFID-kaart" -#: amelie/personal_tab/templates/pos/show_qr.html:23 -#: amelie/personal_tab/templates/pos/verify.html:13 +#: amelie/personal_tab/templates/pos/show_qr.html:23 amelie/personal_tab/templates/pos/verify.html:13 msgid "Error" msgstr "Fout" @@ -12272,17 +9381,14 @@ msgstr "Je mag dit venster nu sluiten." #: amelie/personal_tab/templates/pos/verify.html:20 #, python-format -msgid "" -"Or go to the homepage" -msgstr "" -"Of ga naar de homepage" +msgid "Or go to the homepage" +msgstr "Of ga naar de homepage" #: amelie/personal_tab/templates/price_list.html:18 msgid "kCal/euro" msgstr "kCal/euro" -#: amelie/personal_tab/templates/register/register_card_error.html:4 -#: amelie/personal_tab/templates/register/register_card_error.html:8 +#: amelie/personal_tab/templates/register/register_card_error.html:4 amelie/personal_tab/templates/register/register_card_error.html:8 msgid "Register an RFID card - Error" msgstr "Registreer een RFID-kaart - Error" @@ -12290,10 +9396,7 @@ msgstr "Registreer een RFID-kaart - Error" msgid "Something went wrong while registering your RFID card" msgstr "Er ging iets fout bij het registreren van je RFID-kaart" -#: amelie/personal_tab/templates/register/register_card_index.html:4 -#: amelie/personal_tab/templates/register/register_card_index.html:8 -#: amelie/personal_tab/templates/register/register_card_scan.html:4 -#: amelie/personal_tab/templates/register/register_card_scan.html:44 +#: amelie/personal_tab/templates/register/register_card_index.html:4 amelie/personal_tab/templates/register/register_card_index.html:8 amelie/personal_tab/templates/register/register_card_scan.html:4 amelie/personal_tab/templates/register/register_card_scan.html:44 msgid "Register an RFID card" msgstr "Registreer een RFID-kaart" @@ -12302,15 +9405,10 @@ msgid "Log in to register a card" msgstr "Log in om een kaart te registreren" #: amelie/personal_tab/templates/register/register_card_index.html:12 -msgid "" -"You can log on with your student account (for example: s0123456) or your " -"Inter-Actief account." -msgstr "" -"Je kunt inloggen met je studentaccount (bijvoorbeeld s0123456) of je Inter-" -"Actief-account." +msgid "You can log on with your student account (for example: s0123456) or your Inter-Actief account." +msgstr "Je kunt inloggen met je studentaccount (bijvoorbeeld s0123456) of je Inter-Actief-account." -#: amelie/personal_tab/templates/register/register_card_index.html:19 -#: templates/profile_overview.html:181 templates/profile_overview.html:220 +#: amelie/personal_tab/templates/register/register_card_index.html:19 templates/profile_overview.html:181 templates/profile_overview.html:220 msgid "Username" msgstr "Gebruikersnaam" @@ -12331,12 +9429,8 @@ msgid "Scanned card, please wait..." msgstr "Kaart gescand, een moment geduld aub..." #: amelie/personal_tab/templates/register/register_card_scan.html:30 -msgid "" -"Card type is unknown. Please use normal RFID cards like your college card or " -"public transport card." -msgstr "" -"Kaarttype is onbekend. Probeer een normale RFID kaart te scannen zoals je " -"collegekaart of OV-chipkaart." +msgid "Card type is unknown. Please use normal RFID cards like your college card or public transport card." +msgstr "Kaarttype is onbekend. Probeer een normale RFID kaart te scannen zoals je collegekaart of OV-chipkaart." #: amelie/personal_tab/templates/register/register_card_scan.html:32 msgid "Error, could not scan card." @@ -12346,8 +9440,7 @@ msgstr "Error, kon kaart niet scannen." msgid "Connecting to card reader..." msgstr "Verbinden met kaartlezer..." -#: amelie/personal_tab/templates/register/register_card_success.html:4 -#: amelie/personal_tab/templates/register/register_card_success.html:13 +#: amelie/personal_tab/templates/register/register_card_success.html:4 amelie/personal_tab/templates/register/register_card_success.html:13 msgid "Register an RFID card - Success" msgstr "Registreer een RFID-kaart - Succes" @@ -12359,25 +9452,19 @@ msgstr "Je wordt over 5 seconden teruggebracht naar het registratiescherm..." msgid "Go back now" msgstr "Ga nu terug" -#: amelie/personal_tab/templates/wrapped.html:9 -#: amelie/personal_tab/templates/wrapped_no_transactions.html:9 +#: amelie/personal_tab/templates/wrapped.html:9 amelie/personal_tab/templates/wrapped_no_transactions.html:9 msgid "Cookie Corner Wrapped " msgstr "Cookie Corner Wrapped " -#: amelie/personal_tab/templates/wrapped.html:14 -#: amelie/personal_tab/templates/wrapped_no_transactions.html:14 +#: amelie/personal_tab/templates/wrapped.html:14 amelie/personal_tab/templates/wrapped_no_transactions.html:14 #, python-format msgid "" "\n" -" Now that the year is over, we can take a look into the usage of " -"the cookie corner in %(year)s. On this page you can view your personal " -"statistics for the cookie corner.\n" +" Now that the year is over, we can take a look into the usage of the cookie corner in %(year)s. On this page you can view your personal statistics for the cookie corner.\n" " " msgstr "" "\n" -"Nu dat het jaar voorbij is, kunnen we een kijkje doen in de statistieken van " -"de cookie corner in %(year)s. Op deze pagina vind je je persoonlijke " -"statistieken." +"Nu dat het jaar voorbij is, kunnen we een kijkje doen in de statistieken van de cookie corner in %(year)s. Op deze pagina vind je je persoonlijke statistieken." #: amelie/personal_tab/templates/wrapped.html:24 msgid "Statistics per day" @@ -12387,8 +9474,7 @@ msgstr "Statistieken per dag" msgid "First transaction of the year: " msgstr "Eerste transactie van het jaar: " -#: amelie/personal_tab/templates/wrapped.html:32 -#: amelie/personal_tab/templates/wrapped.html:41 +#: amelie/personal_tab/templates/wrapped.html:32 amelie/personal_tab/templates/wrapped.html:41 msgid "on" msgstr "op" @@ -12401,19 +9487,14 @@ msgid "Top 5 products" msgstr "Top 5 producten" #: amelie/personal_tab/templates/wrapped.html:55 -msgid "" -"You bought certain items more than others during this year. What did you buy " -"the most?" -msgstr "" -"Sommige producten haalde je meer dan anderen. Wat heb je het meeste gekocht?" +msgid "You bought certain items more than others during this year. What did you buy the most?" +msgstr "Sommige producten haalde je meer dan anderen. Wat heb je het meeste gekocht?" -#: amelie/personal_tab/templates/wrapped.html:62 -#: amelie/personal_tab/templates/wrapped.html:127 +#: amelie/personal_tab/templates/wrapped.html:62 amelie/personal_tab/templates/wrapped.html:127 msgid "Item" msgstr "Product" -#: amelie/personal_tab/templates/wrapped.html:64 -#: amelie/personal_tab/templates/wrapped.html:129 +#: amelie/personal_tab/templates/wrapped.html:64 amelie/personal_tab/templates/wrapped.html:129 msgid "Kcal" msgstr "Kcal" @@ -12478,15 +9559,12 @@ msgstr "Inschrijven {activity}" msgid "Unenrolled for {activity}" msgstr "Uitschrijven {activity}" -#: amelie/personal_tab/transactions.py:111 -#: amelie/personal_tab/transactions.py:211 +#: amelie/personal_tab/transactions.py:111 amelie/personal_tab/transactions.py:211 #, python-brace-format msgid "Sale {category}::{article}" msgstr "Verkoop {category}::{article}" -#: amelie/personal_tab/views.py:477 amelie/personal_tab/views.py:742 -#: amelie/personal_tab/views.py:773 amelie/personal_tab/views.py:883 -#: amelie/personal_tab/views.py:959 amelie/personal_tab/views.py:993 +#: amelie/personal_tab/views.py:477 amelie/personal_tab/views.py:742 amelie/personal_tab/views.py:773 amelie/personal_tab/views.py:883 amelie/personal_tab/views.py:959 amelie/personal_tab/views.py:993 msgid "Invalid date`" msgstr "Ongeldige datum" @@ -12523,9 +9601,7 @@ msgstr "Al een lopend amendement" msgid "Reversal already exists" msgstr "Terugboeking bestaat al" -#: amelie/personal_tab/views.py:1569 amelie/personal_tab/views.py:1663 -#: amelie/room_duty/templates/room_duty/pool/persons_change.html:52 -#: amelie/room_duty/templates/room_duty/table/change_persons.html:52 +#: amelie/personal_tab/views.py:1569 amelie/personal_tab/views.py:1663 amelie/room_duty/templates/room_duty/pool/persons_change.html:52 amelie/room_duty/templates/room_duty/table/change_persons.html:52 msgid "Found nobody." msgstr "Geen personen gevonden." @@ -12538,12 +9614,8 @@ msgid "default thumbnail" msgstr "standaardthumbnail" #: amelie/publications/models.py:28 -msgid "" -"This thumbnail is shown when a publication of this type is uploaded without " -"thumbnail." -msgstr "" -"Deze thumbnail wordt weergegeven als een publicatie van dit type zonder " -"thumbnail geplaatst wordt." +msgid "This thumbnail is shown when a publication of this type is uploaded without thumbnail." +msgstr "Deze thumbnail wordt weergegeven als een publicatie van dit type zonder thumbnail geplaatst wordt." #: amelie/publications/models.py:34 msgid "publication type" @@ -12573,9 +9645,7 @@ msgstr "publicaties" msgid "New publication" msgstr "Nieuwe publicatie" -#: amelie/publications/templates/publications/publication_form.html:8 -#: amelie/publications/templates/publications/publication_form.html:22 -#: amelie/publications/templates/publications/publication_form.html:59 +#: amelie/publications/templates/publications/publication_form.html:8 amelie/publications/templates/publications/publication_form.html:22 amelie/publications/templates/publications/publication_form.html:59 msgid "Change publication" msgstr "Publicatie wijzigen" @@ -12603,9 +9673,7 @@ msgstr "Publicatiedatum" msgid "Create publication" msgstr "Publicatie aanmaken" -#: amelie/publications/templates/publications/publications.html:4 -#: amelie/publications/templates/publications/publications.html:9 -#: templates/basis.html:150 +#: amelie/publications/templates/publications/publications.html:4 amelie/publications/templates/publications/publications.html:9 templates/basis.html:150 msgid "Publications" msgstr "Publicaties" @@ -12614,12 +9682,8 @@ msgid "Add publication" msgstr "Publicatie toevoegen" #: amelie/publications/templates/publications/publications.html:24 -msgid "" -"Below you can find the different publications of Inter-Actief, as " -"they have been published over the years." -msgstr "" -"Hieronder vind je de verschillende publicaties van Inter-Actief, " -"zoals die in de afgelopen jaren zijn verschenen." +msgid "Below you can find the different publications of Inter-Actief, as they have been published over the years." +msgstr "Hieronder vind je de verschillende publicaties van Inter-Actief, zoals die in de afgelopen jaren zijn verschenen." #: amelie/publications/templates/publications/publications.html:30 msgid "More publications are available if you" @@ -12629,14 +9693,11 @@ msgstr "Meer publicaties zijn beschikbaar als je bent " msgid "logged in." msgstr "ingelogd." -#: amelie/room_duty/models.py:29 amelie/room_duty/models.py:153 -#: templates/frontpage.html:120 +#: amelie/room_duty/models.py:29 amelie/room_duty/models.py:153 templates/frontpage.html:120 msgid "Office duty" msgstr "Kamerdienst" -#: amelie/room_duty/models.py:30 -#: amelie/room_duty/templates/room_duty/pool/list.html:5 -#: amelie/room_duty/templates/room_duty/pool/list.html:11 +#: amelie/room_duty/models.py:30 amelie/room_duty/templates/room_duty/pool/list.html:5 amelie/room_duty/templates/room_duty/pool/list.html:11 msgid "Office duty pools" msgstr "Kamerdienstpools" @@ -12644,15 +9705,11 @@ msgstr "Kamerdienstpools" msgid "Office duty schedule" msgstr "Kamerdienstschema" -#: amelie/room_duty/models.py:53 -#: amelie/room_duty/templates/room_duty/table/list.html:5 -#: amelie/room_duty/templates/room_duty/table/list.html:11 +#: amelie/room_duty/models.py:53 amelie/room_duty/templates/room_duty/table/list.html:5 amelie/room_duty/templates/room_duty/table/list.html:11 msgid "Office duty schedules" msgstr "Kamerdienstschema's" -#: amelie/room_duty/models.py:58 -#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:46 -#: amelie/statistics/templates/statistics.html:33 templates/basis.html:156 +#: amelie/room_duty/models.py:58 amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:46 amelie/statistics/templates/statistics.html:33 templates/basis.html:156 msgid "Association" msgstr "Vereniging" @@ -12669,9 +9726,7 @@ msgstr "Bestuursleden" msgid "Office duty from {begin} till {end}" msgstr "Room duty from {begin} to {end}" -#: amelie/room_duty/models.py:154 -#: amelie/room_duty/templates/room_duty/table/change.html:33 -#: amelie/room_duty/templates/room_duty/template/change.html:33 +#: amelie/room_duty/models.py:154 amelie/room_duty/templates/room_duty/table/change.html:33 amelie/room_duty/templates/room_duty/template/change.html:33 msgid "Office duties" msgstr "Kamerdiensten" @@ -12679,18 +9734,14 @@ msgstr "Kamerdiensten" msgid "Office duty schedule template" msgstr "Kamerdienstschema-template" -#: amelie/room_duty/models.py:190 -#: amelie/room_duty/templates/room_duty/template/list.html:5 -#: amelie/room_duty/templates/room_duty/template/list.html:11 +#: amelie/room_duty/models.py:190 amelie/room_duty/templates/room_duty/template/list.html:5 amelie/room_duty/templates/room_duty/template/list.html:11 msgid "Office duty schedule templates" msgstr "Kamerdienstschema-templates" #: amelie/room_duty/models.py:223 #, python-brace-format -msgid "" -"Day {dfrom}, {hfrom:02d}:{mfrom:02d} till day {dto}, {hto:02d}:{mto:02d}" -msgstr "" -"Dag {dfrom}, {hfrom:02d}:{mfrom:02d} tot dag {dto}, {hto:02d}:{mto:02d}" +msgid "Day {dfrom}, {hfrom:02d}:{mfrom:02d} till day {dto}, {hto:02d}:{mto:02d}" +msgstr "Dag {dfrom}, {hfrom:02d}:{mfrom:02d} tot dag {dto}, {hto:02d}:{mto:02d}" #: amelie/room_duty/models.py:233 msgid "Office duty template" @@ -12728,8 +9779,7 @@ msgstr "Kamerdienstbeschikbaarheid" msgid "Office duty availabilities" msgstr "Kamerdienstbeschikbaarheden" -#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:5 -#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:10 +#: amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:5 amelie/room_duty/templates/room_duty/balcony_duty/balcony_duty.html:10 msgid "Balcony Duty Associations" msgstr "Balkondienstverenigingen" @@ -12753,8 +9803,7 @@ msgstr "Vereniging toevoegen" msgid "Is Inter-Actief?" msgstr "Is Inter-Actief?" -#: amelie/room_duty/templates/room_duty/balcony_duty/delete.html:5 -#: amelie/room_duty/templates/room_duty/balcony_duty/delete.html:10 +#: amelie/room_duty/templates/room_duty/balcony_duty/delete.html:5 amelie/room_duty/templates/room_duty/balcony_duty/delete.html:10 msgid "Delete balcony duty association" msgstr "Verwijder Balkondienstvereniging" @@ -12768,8 +9817,7 @@ msgstr "" "\n" "Weet je zeker dat je %(association)s wilt verwijderen?" -#: amelie/room_duty/templates/room_duty/pool/delete.html:5 -#: amelie/room_duty/templates/room_duty/pool/delete.html:11 +#: amelie/room_duty/templates/room_duty/pool/delete.html:5 amelie/room_duty/templates/room_duty/pool/delete.html:11 #, python-format msgid "Delete office duty pool %(pool)s" msgstr "Kamerdienstpool %(pool)s verwijderen" @@ -12792,8 +9840,7 @@ msgstr "Deze kamerdienstpool bevat de volgende personen:" msgid "This action will remove the following office duty schedules:" msgstr "Deze actie zal de volgende kamerdienstschema's verwijderen:" -#: amelie/room_duty/templates/room_duty/pool/form.html:5 -#: amelie/room_duty/templates/room_duty/pool/form.html:11 +#: amelie/room_duty/templates/room_duty/pool/form.html:5 amelie/room_duty/templates/room_duty/pool/form.html:11 msgid "Add office duty pool" msgstr "Kamerdienstpool toevoegen" @@ -12823,22 +9870,15 @@ msgstr "%(pool)s bevat nog geen personen." msgid "Add persons" msgstr "Personen toevoegen" -#: amelie/room_duty/templates/room_duty/pool/persons_change.html:39 -#: amelie/room_duty/templates/room_duty/table/change_persons.html:39 +#: amelie/room_duty/templates/room_duty/pool/persons_change.html:39 amelie/room_duty/templates/room_duty/table/change_persons.html:39 msgid "People found:" msgstr "Gevonden personen:" -#: amelie/room_duty/templates/room_duty/table/change.html:5 -#: amelie/room_duty/templates/room_duty/table/change.html:10 -#: amelie/room_duty/templates/room_duty/table/form.html:8 -#: amelie/room_duty/templates/room_duty/table/form.html:18 +#: amelie/room_duty/templates/room_duty/table/change.html:5 amelie/room_duty/templates/room_duty/table/change.html:10 amelie/room_duty/templates/room_duty/table/form.html:8 amelie/room_duty/templates/room_duty/table/form.html:18 msgid "Change office duty schedule" msgstr "Kamerdienstschema wijzigen" -#: amelie/room_duty/templates/room_duty/table/change.html:21 -#: amelie/room_duty/templates/room_duty/table/room_duty_add.html:5 -#: amelie/room_duty/templates/room_duty/table/room_duty_add.html:10 -#: amelie/room_duty/templates/room_duty/template/change.html:21 +#: amelie/room_duty/templates/room_duty/table/change.html:21 amelie/room_duty/templates/room_duty/table/room_duty_add.html:5 amelie/room_duty/templates/room_duty/table/room_duty_add.html:10 amelie/room_duty/templates/room_duty/template/change.html:21 msgid "Add office duty" msgstr "Kamerdienst toevoegen" @@ -12860,8 +9900,7 @@ msgstr "%(table)s bevat nog geen personen." msgid "Add participants" msgstr "Deelnemers toevoegen" -#: amelie/room_duty/templates/room_duty/table/delete.html:5 -#: amelie/room_duty/templates/room_duty/table/delete.html:11 +#: amelie/room_duty/templates/room_duty/table/delete.html:5 amelie/room_duty/templates/room_duty/table/delete.html:11 #, python-format msgid "Remove office duty schedule %(table)s" msgstr "Kamerdienstschema %(table)s verwijderen" @@ -12870,8 +9909,7 @@ msgstr "Kamerdienstschema %(table)s verwijderen" #, python-format msgid "" "\n" -" Are you sure you want to remove the office duty schedule " -"%(table)s?\n" +" Are you sure you want to remove the office duty schedule %(table)s?\n" " " msgstr "" "\n" @@ -12898,8 +9936,7 @@ msgstr "Brak" msgid "Not in the break" msgstr "Niet in de pauze" -#: amelie/room_duty/templates/room_duty/table/form.html:6 -#: amelie/room_duty/templates/room_duty/table/form.html:16 +#: amelie/room_duty/templates/room_duty/table/form.html:6 amelie/room_duty/templates/room_duty/table/form.html:16 msgid "Add office duty schedule" msgstr "Kamerdienstschema toevoegen" @@ -12907,8 +9944,7 @@ msgstr "Kamerdienstschema toevoegen" msgid "Pool" msgstr "Pool" -#: amelie/room_duty/templates/room_duty/table/form.html:42 -#: amelie/tools/forms.py:110 amelie/tools/forms.py:112 +#: amelie/room_duty/templates/room_duty/table/form.html:42 amelie/tools/forms.py:110 amelie/tools/forms.py:112 msgid "Template" msgstr "Template" @@ -12952,8 +9988,7 @@ msgstr "Ochtendkamerdiensten" msgid "Afternoon office duties" msgstr "Middagkamerdiensten" -#: amelie/room_duty/templates/room_duty/table/room_duty_delete.html:5 -#: amelie/room_duty/templates/room_duty/table/room_duty_delete.html:11 +#: amelie/room_duty/templates/room_duty/table/room_duty_delete.html:5 amelie/room_duty/templates/room_duty/table/room_duty_delete.html:11 #, python-format msgid "Delete office duty %(room_duty)s" msgstr "Kamerdienst %(room_duty)s verwijderen" @@ -12985,8 +10020,7 @@ msgstr[1] "" "\n" "%(count)s personen hebben al hun beschikbaarheid aangegeven." -#: amelie/room_duty/templates/room_duty/template/add.html:5 -#: amelie/room_duty/templates/room_duty/template/add.html:11 +#: amelie/room_duty/templates/room_duty/template/add.html:5 amelie/room_duty/templates/room_duty/template/add.html:11 msgid "Add an office duty schedule template" msgstr "Kamerdienstschema-template toevoegen" @@ -12998,8 +10032,7 @@ msgstr "Kamerdienstschema-template wijzigen" msgid "Change title" msgstr "Titel wijzigen" -#: amelie/room_duty/templates/room_duty/template/delete.html:5 -#: amelie/room_duty/templates/room_duty/template/delete.html:11 +#: amelie/room_duty/templates/room_duty/template/delete.html:5 amelie/room_duty/templates/room_duty/template/delete.html:11 #, python-format msgid "Delete office duty schedule template %(template)s" msgstr "Kamerdienstschema-template %(template)s verwijderen" @@ -13008,56 +10041,43 @@ msgstr "Kamerdienstschema-template %(template)s verwijderen" #, python-format msgid "" "\n" -" Are you sure you want to remove the office duty schedule " -"template %(template)s?\n" +" Are you sure you want to remove the office duty schedule template %(template)s?\n" " " msgstr "" "\n" -"Weet je zeker dat je het kamerdienstschema-template %(template)s wilt " -"verwijderen?" +"Weet je zeker dat je het kamerdienstschema-template %(template)s wilt verwijderen?" #: amelie/room_duty/templates/room_duty/template/list.html:27 msgid "There are no office duty schedule templates yet." msgstr "Er zijn nog geen kamerdienstschema-templates." -#: amelie/room_duty/templates/room_duty/template/room_duty_add.html:5 -#: amelie/room_duty/templates/room_duty/template/room_duty_add.html:10 +#: amelie/room_duty/templates/room_duty/template/room_duty_add.html:5 amelie/room_duty/templates/room_duty/template/room_duty_add.html:10 msgid "Add office duty template" msgstr "Kamerdienst-template toevoegen" -#: amelie/settings/generic.py:121 +#: amelie/settings/generic.py:123 msgid "Dutch" msgstr "Nederlands" -#: amelie/settings/generic.py:122 +#: amelie/settings/generic.py:124 msgid "English" msgstr "Engels" -#: amelie/settings/generic.py:654 -msgid "" -"Access to your name, date of birth, student number, mandate status and " -"committee status." -msgstr "" -"Toegang tot je naam, geboortedatum, studentnummer, machtiging- en " -"commissiestatus" +#: amelie/settings/generic.py:701 +msgid "Access to your name, date of birth, student number, mandate status and committee status." +msgstr "Toegang tot je naam, geboortedatum, studentnummer, machtiging- en commissiestatus" -#: amelie/settings/generic.py:655 -msgid "" -"Access to enrollments for activities and (un)enrolling you for activities." -msgstr "" -"Toegang tot inschrijvingen voor activiteiten en het in- en uitschrijven voor " -"activiteiten" +#: amelie/settings/generic.py:702 +msgid "Access to enrollments for activities and (un)enrolling you for activities." +msgstr "Toegang tot inschrijvingen voor activiteiten en het in- en uitschrijven voor activiteiten" -#: amelie/settings/generic.py:656 -msgid "" -"Access to transactions, direct debit transactions, mandates and RFID-cards." +#: amelie/settings/generic.py:703 +msgid "Access to transactions, direct debit transactions, mandates and RFID-cards." msgstr "Toegang tot transacties, incasso's, machtigingen en RFID-kaarten" -#: amelie/settings/generic.py:657 +#: amelie/settings/generic.py:704 msgid "Access to complaints and sending or supporting complaints in your name." -msgstr "" -"Toegang tot onderwijsklachten en het indienen of steunen van " -"onderwijsklachten" +msgstr "Toegang tot onderwijsklachten en het indienen of steunen van onderwijsklachten" #: amelie/statistics/models.py:9 msgid "User-Agent" @@ -13071,8 +10091,7 @@ msgstr "Hits" msgid "Hits between {} and {} on page '{}' with User-Agent '{}'" msgstr "Hits tussen {} en {} op pagina '{}' met User-Agent '{}'" -#: amelie/statistics/templates/hits.html:5 -#: amelie/statistics/templates/statistics.html:26 +#: amelie/statistics/templates/hits.html:5 amelie/statistics/templates/statistics.html:26 msgid "Page visits" msgstr "Paginabezoeken" @@ -13091,10 +10110,8 @@ msgstr "Afgelopen 4 weken:" #: amelie/statistics/templates/statistics.html:14 msgid "" "\n" -" Below you can find statistics and information about " -"Inter-Actief and the website itself.\n" -" The data is no older than an hour. Data about a specific " -"year is calculated in academic years.\n" +" Below you can find statistics and information about Inter-Actief and the website itself.\n" +" The data is no older than an hour. Data about a specific year is calculated in academic years.\n" " " msgstr "" "\n" @@ -13169,26 +10186,12 @@ msgstr "Gezondste bestuurder:" #: amelie/tools/auth.py:45 #, python-brace-format -msgid "" -"You were successfully logged in, but we could not verify your identity. This " -"might be the case if your login session has expired. Please click here to log out completely and " -"try again." -msgstr "" -"Je bent succesvol ingelogd, maar we konden uw identiteit niet verifiëren. " -"Dit kan het geval zijn als uw inlogsessie is verlopen. Klik hier om volledig uit te loggen " -"en probeer het opnieuw." +msgid "You were successfully logged in, but we could not verify your identity. This might be the case if your login session has expired. Please click here to log out completely and try again." +msgstr "Je bent succesvol ingelogd, maar we konden uw identiteit niet verifiëren. Dit kan het geval zijn als uw inlogsessie is verlopen. Klik hier om volledig uit te loggen en probeer het opnieuw." #: amelie/tools/auth.py:144 -msgid "" -"You were successfully logged in, but no account could be found. This might " -"be the case if you aren't a member yet, or aren't a member anymore. If you " -"want to become a member you can contact the board." -msgstr "" -"Je bent succesvol ingelogd, maar er kon geen account worden gevonden. Dit " -"kan het geval zijn als je nog geen lid bent of geen lid meer bent. Om lid te " -"worden kun je contact opnemen met het bestuur." +msgid "You were successfully logged in, but no account could be found. This might be the case if you aren't a member yet, or aren't a member anymore. If you want to become a member you can contact the board." +msgstr "Je bent succesvol ingelogd, maar er kon geen account worden gevonden. Dit kan het geval zijn als je nog geen lid bent of geen lid meer bent. Om lid te worden kun je contact opnemen met het bestuur." #: amelie/tools/calendar.py:126 msgid "[START] {}" @@ -13210,8 +10213,7 @@ msgstr "Uitsluitend toegankelijk voor het bestuur." msgid "Access for the Educational Committee only." msgstr "Uitsluitend toegankelijk voor de onderwijscommissie." -#: amelie/tools/decorators.py:60 amelie/tools/decorators.py:66 -#: amelie/tools/mixins.py:73 +#: amelie/tools/decorators.py:60 amelie/tools/decorators.py:66 amelie/tools/mixins.py:73 msgid "For active members only." msgstr "Uitsluitend voor leden met een actief lidmaatschap." @@ -13223,8 +10225,7 @@ msgstr "Uitsluitend toegankelijk voor actieve leden." msgid "Only accessible by superusers." msgstr "Uitsluitend toegankelijk voor superusers." -#: amelie/tools/decorators.py:90 amelie/tools/mixins.py:100 -#: amelie/tools/mixins.py:114 amelie/tools/mixins.py:129 +#: amelie/tools/decorators.py:90 amelie/tools/mixins.py:100 amelie/tools/mixins.py:114 amelie/tools/mixins.py:129 msgid "Access for members of the committee only." msgstr "Uitsluitend toegankelijk voor commissieleden." @@ -13277,12 +10278,8 @@ msgid "The type of export that was made." msgstr "Het soort export wat is gedaan." #: amelie/tools/models.py:31 -msgid "" -"Details about the export, like applied filters, the object that was " -"exported, etc. Empty often means that no filters have been applied." -msgstr "" -"Details over de export zoals toegepaste filters, het object dat is " -"geëxporteerd, etc. Leeg betekent vaak dat er geen filters zijn toegepast." +msgid "Details about the export, like applied filters, the object that was exported, etc. Empty often means that no filters have been applied." +msgstr "Details over de export zoals toegepaste filters, het object dat is geëxporteerd, etc. Leeg betekent vaak dat er geen filters zijn toegepast." #: amelie/tools/models.py:35 msgid "The reason that the user gave for the export." @@ -13301,11 +10298,8 @@ msgid "Name of exporter" msgstr "Naam van exporteur" #: amelie/tools/models.py:43 -msgid "" -"String version of the exporter, for when their Person object is removed." -msgstr "" -"String-versie van de exporter, voor wanneer het Persoon-object wordt " -"verwijderd." +msgid "String version of the exporter, for when their Person object is removed." +msgstr "String-versie van de exporter, voor wanneer het Persoon-object wordt verwijderd." #: amelie/tools/models.py:47 msgid "The date and time of the export." @@ -13324,27 +10318,18 @@ msgid "Membership form" msgstr "Lidmaatschapformulier" #: amelie/tools/pdf.py:81 -msgid "" -"By signing this document I agree to all terms of membership of the bylaws " -"and the Rules and Regulations of this association." -msgstr "" -"Door dit document te ondertekenen ga ik akkoord met alle voorwaarden van het " -"lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de " -"vereniging." +msgid "By signing this document I agree to all terms of membership of the bylaws and the Rules and Regulations of this association." +msgstr "Door dit document te ondertekenen ga ik akkoord met alle voorwaarden van het lidmaatschap volgens het Huishoudelijk Regelement en de Statuten van de vereniging." #: amelie/tools/pdf.py:93 -msgid "" -"The following personal information will be included in the membership " -"records:" -msgstr "" -"De volgende gegevens van mij worden opgenomen in de ledenadministratie:" +msgid "The following personal information will be included in the membership records:" +msgstr "De volgende gegevens van mij worden opgenomen in de ledenadministratie:" #: amelie/tools/pdf.py:124 msgid "E-mail of parent(s)/guardian(s)" msgstr "E-mail van ouder(s)/verzorger(s)" -#: amelie/tools/pdf.py:268 amelie/tools/pdf.py:270 amelie/tools/pdf.py:471 -#: amelie/tools/pdf.py:473 +#: amelie/tools/pdf.py:268 amelie/tools/pdf.py:270 amelie/tools/pdf.py:471 amelie/tools/pdf.py:473 #, python-format msgid "Signed in Enschede on %(datum)s:" msgstr "Was getekend in Enschede op %(datum)s:" @@ -13394,12 +10379,8 @@ msgid "Creditor identifier" msgstr "Incassant ID" #: amelie/tools/pdf.py:468 -msgid "" -"By signing this form, undersigned agrees with the arrangement as described " -"above." -msgstr "" -"Ondergetekende verklaart zich akkoord met de regeling zoals hierboven " -"beschreven." +msgid "By signing this form, undersigned agrees with the arrangement as described above." +msgstr "Ondergetekende verklaart zich akkoord met de regeling zoals hierboven beschreven." #: amelie/tools/saml_processors.py:91 msgid "Unknown user in system." @@ -13414,30 +10395,20 @@ msgid "No exports saved" msgstr "Geen exports opgeslagen" #: amelie/tools/templates/gdpr_export_notice.html:3 -msgid "" -"To comply with the European GDPR law, we have to save a reason for all data " -"exports that contain personal data. Please enter the reason that you want " -"this export below." -msgstr "" -"Om te voldoen aan de GDPR-wet, moeten we een reden opslaan voor alle data-" -"exports die gegevens van leden bevatten. Vul alsjeblieft hieronder een reden " -"in waarom je deze export wilt maken." +msgid "To comply with the European GDPR law, we have to save a reason for all data exports that contain personal data. Please enter the reason that you want this export below." +msgstr "Om te voldoen aan de GDPR-wet, moeten we een reden opslaan voor alle data-exports die gegevens van leden bevatten. Vul alsjeblieft hieronder een reden in waarom je deze export wilt maken." #: amelie/tools/templates/send_oauth_link_code.mail:4 msgid "Connect external account" msgstr "Externe account koppelen" #: amelie/tools/templates/send_oauth_link_code.mail:8 -msgid "" -"You receive this e-mail because you can no longer login to online services of" -msgstr "" -"Je ontvangt deze e-mail omdat je niet (meer) kunt inloggen op de online " -"diensten van" +msgid "You receive this e-mail because you can no longer login to online services of" +msgstr "Je ontvangt deze e-mail omdat je niet (meer) kunt inloggen op de online diensten van" #: amelie/tools/templates/send_oauth_link_code.mail:9 msgid "" -"This is because you are not/no longer a student or employee of the " -"University of Twente.\n" +"This is because you are not/no longer a student or employee of the University of Twente.\n" "\n" "You can connect an external account through the following steps:" msgstr "" @@ -13471,12 +10442,8 @@ msgid "Your account should now be linked." msgstr "Je account is nu gekoppeld" #: amelie/tools/templates/send_oauth_link_code.mail:20 -msgid "" -"The link code will remain valid for 3 days, please complete the steps before " -"then or request a new code at the Board." -msgstr "" -"De link code is 3 dagen geldig, voer a.u.b. deze stappen binnen die tijd uit " -"of vraag een nieuwe code aan bij het Bestuur." +msgid "The link code will remain valid for 3 days, please complete the steps before then or request a new code at the Board." +msgstr "De link code is 3 dagen geldig, voer a.u.b. deze stappen binnen die tijd uit of vraag een nieuwe code aan bij het Bestuur." #: amelie/tools/templates/send_oauth_link_code.mail:22 msgid "" @@ -13488,8 +10455,7 @@ msgstr "" "\n" "Met vriendelijke groet," -#: amelie/tools/templates/set_as_today_button.html:2 -#: templates/frontpage.html:19 +#: amelie/tools/templates/set_as_today_button.html:2 templates/frontpage.html:19 msgid "Now" msgstr "Nu" @@ -13501,23 +10467,17 @@ msgstr "Afleverrapport Pushnotificatie" msgid "" "You receive this e-mail report because you sent a push notification.\n" "\n" -"The following push notifications have been sent (possible variables have " -"been filled with the first person):" +"The following push notifications have been sent (possible variables have been filled with the first person):" msgstr "" "Je ontvangt dit e-mailrapport omdat je een push notificatie verstuurd hebt.\n" "\n" -"De volgende push notificaties zijn verstuurd (eventuele variabelen zijn " -"opgevuld met de eerste persoon):" +"De volgende push notificaties zijn verstuurd (eventuele variabelen zijn opgevuld met de eerste persoon):" #: amelie/tools/templates/tools/push_report.mail:16 #, python-format -msgid "" -"This message has been sent to %(recipients)s numbers. Of these " -"%(successful_push_recipients)s have been sent through a push message and " -"%(not_accepted)s have not been sent." +msgid "This message has been sent to %(recipients)s numbers. Of these %(successful_push_recipients)s have been sent through a push message and %(not_accepted)s have not been sent." msgstr "" -"Dit bericht is verstuurd naar %(recipients)s nummers. Hiervan zijn er " -"%(successful_push_recipients)s verstuurd per\n" +"Dit bericht is verstuurd naar %(recipients)s nummers. Hiervan zijn er %(successful_push_recipients)s verstuurd per\n" "pushbericht, en %(not_accepted)s zijn niet verstuurd." #: amelie/tools/templates/tools/push_report.mail:18 @@ -13549,13 +10509,11 @@ msgstr "Uren" msgid "Minutes" msgstr "Minuten" -#: amelie/twitter/templates/twitter_index.html:4 -#: amelie/twitter/templates/twitter_new_tweet.html:5 +#: amelie/twitter/templates/twitter_index.html:4 amelie/twitter/templates/twitter_new_tweet.html:5 msgid "New tweet" msgstr "Nieuwe tweet" -#: amelie/twitter/templates/twitter_index.html:8 -#: amelie/twitter/templates/twitter_new_tweet.html:29 +#: amelie/twitter/templates/twitter_index.html:8 amelie/twitter/templates/twitter_new_tweet.html:29 msgid "New Tweet" msgstr "Nieuwe Tweet" @@ -13568,16 +10526,14 @@ msgstr "Tweet toevoegen" msgid "" "\n" " Check your message before you send it.\n" -" This message will be sent from this account: " -"%(account)s.\n" +" This message will be sent from this account: %(account)s.\n" "\t\t\t\t\t" msgstr "" "\n" "Controleer je bericht goed voordat je deze daadwerkelijk verzend.\n" "Dit bericht wordt verzonden vanaf het account %(account)s." -#: amelie/twitter/templates/twitter_new_tweet.html:38 -#: amelie/twitter/templates/twitter_new_tweet.html:47 +#: amelie/twitter/templates/twitter_new_tweet.html:38 amelie/twitter/templates/twitter_new_tweet.html:47 msgid "Preview" msgstr "Preview" @@ -13603,6 +10559,24 @@ msgstr "YouTube video met ID \"%(video_id)s\" bestaat niet." msgid "Streaming.IA video with ID \"%(video_id)s\" doesn't exist." msgstr "Streaming.IA video met ID \"%(video_id)s\" bestaat niet." +#: amelie/videos/graphql.py:24 +#| msgid "YouTube ID" +msgid "YouTube" +msgstr "YouTube" + +#: amelie/videos/graphql.py:25 +#| msgid "Streaming.IA ID" +msgid "Streaming.IA" +msgstr "Streaming IA" + +#: amelie/videos/graphql.py:55 +msgid "Video type (Youtube or IA)" +msgstr "Video type (YouTube of IA)" + +#: amelie/videos/graphql.py:56 +msgid "URL to the video" +msgstr "URL van de video" + #: amelie/videos/models.py:18 msgid "Featured" msgstr "Uitgelicht" @@ -13611,9 +10585,7 @@ msgstr "Uitgelicht" msgid "Video" msgstr "Video" -#: amelie/videos/models.py:26 amelie/videos/templates/videos/videos.html:4 -#: amelie/videos/templates/videos/videos.html:9 templates/basis.html:147 -#: templates/frontpage.html:92 +#: amelie/videos/models.py:26 amelie/videos/templates/videos/videos.html:4 amelie/videos/templates/videos/videos.html:9 templates/basis.html:147 templates/frontpage.html:92 msgid "Videos" msgstr "Video's" @@ -13633,30 +10605,19 @@ msgstr "Streaming.IA video" msgid "Streaming.IA videos" msgstr "Streaming.IA videos" -#: amelie/videos/templates/videos/ia_video.html:15 -#: amelie/videos/templates/videos/yt_video.html:15 +#: amelie/videos/templates/videos/ia_video.html:15 amelie/videos/templates/videos/yt_video.html:15 msgid "All videos" msgstr "Alle videos" -#: amelie/videos/templates/videos/ia_video.html:27 -#: amelie/videos/templates/videos/ia_video_form.html:8 -#: amelie/videos/templates/videos/ia_video_form.html:80 -#: amelie/videos/templates/videos/ia_video_form.html:108 -#: amelie/videos/templates/videos/yt_video.html:27 -#: amelie/videos/templates/videos/yt_video_form.html:8 -#: amelie/videos/templates/videos/yt_video_form.html:80 -#: amelie/videos/templates/videos/yt_video_form.html:108 +#: amelie/videos/templates/videos/ia_video.html:27 amelie/videos/templates/videos/ia_video_form.html:8 amelie/videos/templates/videos/ia_video_form.html:80 amelie/videos/templates/videos/ia_video_form.html:108 amelie/videos/templates/videos/yt_video.html:27 amelie/videos/templates/videos/yt_video_form.html:8 amelie/videos/templates/videos/yt_video_form.html:80 amelie/videos/templates/videos/yt_video_form.html:108 msgid "Edit video" msgstr "Wijzig video" -#: amelie/videos/templates/videos/ia_video.html:28 -#: amelie/videos/templates/videos/video_delete.html:19 -#: amelie/videos/templates/videos/yt_video.html:28 +#: amelie/videos/templates/videos/ia_video.html:28 amelie/videos/templates/videos/video_delete.html:19 amelie/videos/templates/videos/yt_video.html:28 msgid "Delete video" msgstr "Verwijder video" -#: amelie/videos/templates/videos/ia_video_form.html:6 -#: amelie/videos/templates/videos/yt_video_form.html:6 +#: amelie/videos/templates/videos/ia_video_form.html:6 amelie/videos/templates/videos/yt_video_form.html:6 msgid "New video" msgstr "Nieuwe video" @@ -13665,24 +10626,14 @@ msgid "Recent Streaming.IA uploads" msgstr "Recente Streaming.IA uploads" #: amelie/videos/templates/videos/ia_video_form.html:22 -msgid "" -"Select one of these recently uploaded Streaming.IA videos to automatically " -"fill certain fields." -msgstr "" -"Selecteer een van deze recent geüploade Streaming.IA video's om bepaalde " -"velden automatisch in te vullen." +msgid "Select one of these recently uploaded Streaming.IA videos to automatically fill certain fields." +msgstr "Selecteer een van deze recent geüploade Streaming.IA video's om bepaalde velden automatisch in te vullen." -#: amelie/videos/templates/videos/ia_video_form.html:23 -#: amelie/videos/templates/videos/yt_video_form.html:23 -msgid "" -"Videos marked as private and previously added videos are not displayed in " -"this list." -msgstr "" -"Video's gemarkeerd als privé en reeds toegevoegde videos worden niet " -"weergegeven in deze lijst." +#: amelie/videos/templates/videos/ia_video_form.html:23 amelie/videos/templates/videos/yt_video_form.html:23 +msgid "Videos marked as private and previously added videos are not displayed in this list." +msgstr "Video's gemarkeerd als privé en reeds toegevoegde videos worden niet weergegeven in deze lijst." -#: amelie/videos/templates/videos/ia_video_form.html:36 -#: amelie/videos/templates/videos/yt_video_form.html:36 +#: amelie/videos/templates/videos/ia_video_form.html:36 amelie/videos/templates/videos/yt_video_form.html:36 msgid "No (new) videos have been found." msgstr "Er zijn geen (nieuwe) video's gevonden." @@ -13690,8 +10641,7 @@ msgstr "Er zijn geen (nieuwe) video's gevonden." msgid "Streaming.IA API Data" msgstr "Streaming.IA API Data" -#: amelie/videos/templates/videos/ia_video_form.html:62 -#: amelie/videos/templates/videos/yt_video_form.html:62 +#: amelie/videos/templates/videos/ia_video_form.html:62 amelie/videos/templates/videos/yt_video_form.html:62 msgid "Thumbnail URL" msgstr "Thumbnail URL" @@ -13699,8 +10649,7 @@ msgstr "Thumbnail URL" msgid "Update Streaming.IA API Data" msgstr "Streaming.IA API Data bijwerken" -#: amelie/videos/templates/videos/ia_video_form.html:78 -#: amelie/videos/templates/videos/yt_video_form.html:78 +#: amelie/videos/templates/videos/ia_video_form.html:78 amelie/videos/templates/videos/yt_video_form.html:78 msgid "Add new video" msgstr "Nieuwe video toevoegen" @@ -13708,8 +10657,7 @@ msgstr "Nieuwe video toevoegen" msgid "Streaming.IA ID" msgstr "Streaming.IA ID" -#: amelie/videos/templates/videos/ia_video_form.html:108 -#: amelie/videos/templates/videos/yt_video_form.html:108 +#: amelie/videos/templates/videos/ia_video_form.html:108 amelie/videos/templates/videos/yt_video_form.html:108 msgid "Create video" msgstr "Video aanmaken" @@ -13732,15 +10680,12 @@ msgstr "Video toevoegen via Streaming.IA" #: amelie/videos/templates/videos/videos.html:25 msgid "" "\n" -" Every so often the MedIA committee of Inter-Actief " -"records videos of events\n" -" and activities. You can find a list of the most recent " -"videos below.\n" +" Every so often the MedIA committee of Inter-Actief records videos of events\n" +" and activities. You can find a list of the most recent videos below.\n" " \t\t\t" msgstr "" "\n" -"De MedIA-commissie van Inter-Actief maakt geregeld videos van " -"(grotere)\n" +"De MedIA-commissie van Inter-Actief maakt geregeld videos van (grotere)\n" "evenementen en activiteiten. Hieronder vind je de meest recente videos." #: amelie/videos/templates/videos/videos.html:34 @@ -13752,12 +10697,8 @@ msgid "Recent YouTube uploads" msgstr "Recente YouTube uploads" #: amelie/videos/templates/videos/yt_video_form.html:22 -msgid "" -"Select one of these recently uploaded YouTube videos to automatically fill " -"certain fields." -msgstr "" -"Selecteer een van deze recent geüploade YouTube video's om bepaalde velden " -"automatisch in te vullen." +msgid "Select one of these recently uploaded YouTube videos to automatically fill certain fields." +msgstr "Selecteer een van deze recent geüploade YouTube video's om bepaalde velden automatisch in te vullen." #: amelie/videos/templates/videos/yt_video_form.html:44 msgid "YouTube API Data" @@ -13772,20 +10713,12 @@ msgid "YouTube ID" msgstr "YouTube ID" #: amelie/videos/views.py:211 -msgid "" -"Could not connect to Youtube! Please contact the WWW committee if this " -"problem persists." -msgstr "" -"Het is niet gelukt om een verbinding met Youtube te maken! Neem contact op " -"met de WWW commissie als dit probleem blijft aanhouden." +msgid "Could not connect to Youtube! Please contact the WWW committee if this problem persists." +msgstr "Het is niet gelukt om een verbinding met Youtube te maken! Neem contact op met de WWW commissie als dit probleem blijft aanhouden." #: amelie/videos/views.py:271 -msgid "" -"Could not connect to Streaming.IA! Please contact the WWW committee if this " -"problem persists." -msgstr "" -"Het is niet gelukt om een verbinding met Streaming.IA te maken! Neem contact " -"op met de WWW commissie als dit probleem blijft aanhouden." +msgid "Could not connect to Streaming.IA! Please contact the WWW committee if this problem persists." +msgstr "Het is niet gelukt om een verbinding met Streaming.IA te maken! Neem contact op met de WWW commissie als dit probleem blijft aanhouden." #: amelie/views.py:259 #, python-format @@ -13809,12 +10742,8 @@ msgid "News articles" msgstr "Nieuwsartikelen" #: amelie/weekmail/forms.py:17 -msgid "" -"Only news articles of at most 31 days ago are shown, so it is possible that " -"no articles are shown." -msgstr "" -"Alleen nieuwsberichten van maximaal 31 dagen geleden worden getoond, het kan " -"dus zijn dat er geen nieuwsberichten hierboven staan." +msgid "Only news articles of at most 31 days ago are shown, so it is possible that no articles are shown." +msgstr "Alleen nieuwsberichten van maximaal 31 dagen geleden worden getoond, het kan dus zijn dat er geen nieuwsberichten hierboven staan." #: amelie/weekmail/models.py:55 msgid "Not yet sent" @@ -13832,24 +10761,15 @@ msgstr "Verstuurd" msgid "Error during sending" msgstr "Fout tijdens versturen" -#: amelie/weekmail/models.py:61 -#: amelie/weekmail/templates/weekmail/weekmail_list.html:17 -#: amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 +#: amelie/weekmail/models.py:61 amelie/weekmail/templates/weekmail/weekmail_list.html:17 amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 msgid "Weekly mail" msgstr "Weekmail" -#: amelie/weekmail/models.py:62 -#: amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 +#: amelie/weekmail/models.py:62 amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 msgid "Mastermail" msgstr "Mastermail" -#: amelie/weekmail/models.py:63 -#: amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 +#: amelie/weekmail/models.py:63 amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 msgid "Educational mail" msgstr "Onderwijsmail" @@ -13865,15 +10785,11 @@ msgstr "nieuwartikelen" msgid "Type of mailing" msgstr "Type mailing" -#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 -#: amelie/weekmail/templates/weekmail/weekmail_form.html:11 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:5 +#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 amelie/weekmail/templates/weekmail/weekmail_form.html:11 amelie/weekmail/templates/weekmail/weekmail_wizard.html:5 msgid "Edit weekly mail" msgstr "Weekmail wijzigen" -#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 -#: amelie/weekmail/templates/weekmail/weekmail_form.html:11 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:5 +#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 amelie/weekmail/templates/weekmail/weekmail_form.html:11 amelie/weekmail/templates/weekmail/weekmail_wizard.html:5 msgid "Edit mastermail" msgstr "Mastermail wijzigen" @@ -13881,8 +10797,7 @@ msgstr "Mastermail wijzigen" msgid "Edit educational mail" msgstr "Bewerk onderwijsmail" -#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 -#: amelie/weekmail/templates/weekmail/weekmail_form.html:11 +#: amelie/weekmail/templates/weekmail/weekmail_form.html:5 amelie/weekmail/templates/weekmail/weekmail_form.html:11 msgid "Add weekly mail, mastermail or educational mail" msgstr "Weekmail, mastermail of onderwijsmail toevoegen" @@ -13890,13 +10805,11 @@ msgstr "Weekmail, mastermail of onderwijsmail toevoegen" msgid "Done" msgstr "Klaar" -#: amelie/weekmail/templates/weekmail/weekmail_list.html:5 -#: amelie/weekmail/templates/weekmail/weekmail_list.html:11 +#: amelie/weekmail/templates/weekmail/weekmail_list.html:5 amelie/weekmail/templates/weekmail/weekmail_list.html:11 msgid "Weekly mails, mastermails and educational mails" msgstr "Weekmails, mastermails en onderwijsmails" -#: amelie/weekmail/templates/weekmail/weekmail_list.html:19 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:42 +#: amelie/weekmail/templates/weekmail/weekmail_list.html:19 amelie/weekmail/templates/weekmail/weekmail_wizard.html:42 msgid "Published" msgstr "Gepubliceerd" @@ -13904,9 +10817,7 @@ msgstr "Gepubliceerd" msgid "New weekly mail, mastermail or educational mail" msgstr "Nieuwe weekmail, mastermail of onderwijsmail" -#: amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 +#: amelie/weekmail/templates/weekmail/weekmail_mail.mail:1 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:7 amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:31 msgid "Week" msgstr "Week" @@ -13914,16 +10825,9 @@ msgstr "Week" msgid "Read online" msgstr "Lees online" -#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:162 -#: amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:39 -msgid "" -"You are receiving this e-mail because you have indicated you wanted it. " -"Change your preference in your profile on the Inter-Actief website or " -"contact the board." -msgstr "" -"Je ontvangt deze mail omdat je dit hebt aangegeven. Indien je deze mail niet " -"meer wenst te ontvangen, verander dan je voorkeur op je profiel op de Inter-" -"Actief website of neem contact op met het bestuur." +#: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:162 amelie/weekmail/templates/weekmail/weekmail_mail_plain.mail:39 +msgid "You are receiving this e-mail because you have indicated you wanted it. Change your preference in your profile on the Inter-Actief website or contact the board." +msgstr "Je ontvangt deze mail omdat je dit hebt aangegeven. Indien je deze mail niet meer wenst te ontvangen, verander dan je voorkeur op je profiel op de Inter-Actief website of neem contact op met het bestuur." #: amelie/weekmail/templates/weekmail/weekmail_mail_html.mail:163 msgid "I.C.T.S.V. Inter-Actief" @@ -13983,18 +10887,15 @@ msgstr "Wijzig gekoppelde nieuwsartikelen" msgid "Connected activities" msgstr "Gekoppelde Activiteiten" -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:176 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:204 +#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:176 amelie/weekmail/templates/weekmail/weekmail_wizard.html:204 msgid "From:" msgstr "Van:" -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:177 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:205 +#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:177 amelie/weekmail/templates/weekmail/weekmail_wizard.html:205 msgid "To:" msgstr "Tot:" -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:182 -#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:210 +#: amelie/weekmail/templates/weekmail/weekmail_wizard.html:182 amelie/weekmail/templates/weekmail/weekmail_wizard.html:210 msgid "No location provided" msgstr "Geen locatie opgegeven" @@ -14084,23 +10985,15 @@ msgid "The page cannot be requested (405)." msgstr "De pagina kan niet opgevraagd worden (405)." #: templates/basis.html:15 -msgid "" -"Website of I.C.T.S.V. Inter-Actief, the study association for Technical " -"Computer Science and Business Information Technology students at the " -"University of Twente" +msgid "Website of I.C.T.S.V. Inter-Actief, the study association for Technical Computer Science and Business Information Technology students at the University of Twente" msgstr "" "I.C.T.S.V. Inter-Actief is de studievereniging voor de bachelor- en\n" -"masteropleidingen van Technische Informatica en Business Information " -"Technology aan de\n" +"masteropleidingen van Technische Informatica en Business Information Technology aan de\n" "Universiteit Twente." #: templates/basis.html:19 -msgid "" -"inter-actief, utwente, university of twente, computer science, technical " -"computer science, study association, Business Information Technology" -msgstr "" -"inter-actief, utwente, universiteit twente, informatica, technische " -"informatica, studievereniging, Business Information Technology" +msgid "inter-actief, utwente, university of twente, computer science, technical computer science, study association, Business Information Technology" +msgstr "inter-actief, utwente, universiteit twente, informatica, technische informatica, studievereniging, Business Information Technology" #: templates/basis.html:25 msgid "Study Association Inter-Actief" @@ -14111,8 +11004,7 @@ msgid "Frontpage" msgstr "Voorpagina" #: templates/basis.html:65 -msgid "" -"It seems like you are trying to become a board member. Would you like help?" +msgid "It seems like you are trying to become a board member. Would you like help?" msgstr "Het lijkt erop alsof u bestuur probeert te worden, wilt u hulp?" #: templates/basis.html:74 @@ -14268,12 +11160,8 @@ msgid "CVD Policy" msgstr "CVD-beleid" #: templates/frontpage.html:76 -msgid "" -"In the Company Corner you can find information about companies and possible " -"graduation projects or job opportunities." -msgstr "" -"In de Company Corner kun je informatie vinden over bedrijven en mogelijke " -"afstudeerplekken of vacatures die zij bieden." +msgid "In the Company Corner you can find information about companies and possible graduation projects or job opportunities." +msgstr "In de Company Corner kun je informatie vinden over bedrijven en mogelijke afstudeerplekken of vacatures die zij bieden." #: templates/frontpage.html:82 msgid "Upcoming activities with external parties" @@ -14360,26 +11248,12 @@ msgid "You do not have acces to the page you are visiting." msgstr "Voor de pagina die je bezoekt heb je niet genoeg rechten." #: templates/login.html:29 -msgid "" -"You can log in with your UTwente account or with your Inter-Actief account." -msgstr "" -"Je kan inloggen met je UTwente-account of met je Inter-Actief-account." +msgid "You can log in with your UTwente account or with your Inter-Actief account." +msgstr "Je kan inloggen met je UTwente-account of met je Inter-Actief-account." #: templates/login.html:32 -msgid "" -"If you do not have either of these accounts, you can link an external " -"account, like your Google, GitHub, or Facebook account, by contacting the " -"board." -msgstr "" -"Als je geen van beide accounts hebt, dan kan je een extern account, zoals " -"een Google-, GitHub-, of Facebook-account, laten koppelen. Neem hiervoor " -"contact op met het bestuur." +msgid "If you do not have either of these accounts, you can link an external account, like your Google, GitHub, or Facebook account, by contacting the board." +msgstr "Als je geen van beide accounts hebt, dan kan je een extern account, zoals een Google-, GitHub-, of Facebook-account, laten koppelen. Neem hiervoor contact op met het bestuur." #: templates/login.html:35 msgid "Log in with Inter-Actief" @@ -14443,8 +11317,7 @@ msgstr "Toegang" msgid "delete" msgstr "verwijder" -#: templates/profile_configure_forwarding.html:5 -#: templates/profile_configure_forwarding.html:51 +#: templates/profile_configure_forwarding.html:5 templates/profile_configure_forwarding.html:51 msgid "Configure e-mail forwarding" msgstr "E-mailforwarding instellen" @@ -14455,31 +11328,23 @@ msgstr "Geen Google Suite account" #: templates/profile_configure_forwarding.html:37 msgid "" "\n" -" It seems that you don't have a Google Suite account! " -"If you just became an active member, it\n" -" is possible that this just has not been created yet. " -"Please try again later in that case.\n" +" It seems that you don't have a Google Suite account! If you just became an active member, it\n" +" is possible that this just has not been created yet. Please try again later in that case.\n" " " msgstr "" "\n" -"Het lijkt erop dat je geen Google Suite account hebt! Als je pas net actief " -"bent geworden, dan is deze waarschijnlijk gewoon nog niet aangemaakt. " -"Probeer het in dat geval later opnieuw." +"Het lijkt erop dat je geen Google Suite account hebt! Als je pas net actief bent geworden, dan is deze waarschijnlijk gewoon nog niet aangemaakt. Probeer het in dat geval later opnieuw." #: templates/profile_configure_forwarding.html:41 msgid "" "\n" -" If this error keeps occurring, please contact our " -"account managers via account@inter-actief.net.\n" +" If this error keeps occurring, please contact our account managers via account@inter-actief.net.\n" " " msgstr "" "\n" -"Als deze fout zich blijft voordoen, neem dan contact op met onze " -"accountbeheerders via account@inter-actief.net." +"Als deze fout zich blijft voordoen, neem dan contact op met onze accountbeheerders via account@inter-actief.net." -#: templates/profile_configure_forwarding.html:44 -#: templates/profile_configure_forwarding.html:137 -#: templates/profile_configure_forwarding.html:246 +#: templates/profile_configure_forwarding.html:44 templates/profile_configure_forwarding.html:137 templates/profile_configure_forwarding.html:246 msgid "Back to my profile" msgstr "Terug naar mijn profiel" @@ -14487,23 +11352,15 @@ msgstr "Terug naar mijn profiel" #, python-format msgid "" "\n" -" On this page you can configure if e-mails that " -"arrive on your active members e-mail address (%(account_name)s@%(domain)s) " -"should be forwarded to your personal e-mail address (%(personal_email)s).\n" +" On this page you can configure if e-mails that arrive on your active members e-mail address (%(account_name)s@%(domain)s) should be forwarded to your personal e-mail address (%(personal_email)s).\n" " " msgstr "" "\n" -"Op deze pagina kan je instellen of e-mails die binnenkomen op je " -"actieveledene-mail (%(account_name)s@%(domain)s) moeten worden doorgestuurd " -"naar je persoonlijke e-mailadres (%(personal_email)s)." +"Op deze pagina kan je instellen of e-mails die binnenkomen op je actieveledene-mail (%(account_name)s@%(domain)s) moeten worden doorgestuurd naar je persoonlijke e-mailadres (%(personal_email)s)." #: templates/profile_configure_forwarding.html:57 -msgid "" -"For you, this means that e-mails that arrive on the following e-mail " -"addresses will be forwarded:" -msgstr "" -"Voor jou betekent dit dat e-mails die aan komen op de volgende e-" -"mailadressen worden doorgestuurd:" +msgid "For you, this means that e-mails that arrive on the following e-mail addresses will be forwarded:" +msgstr "Voor jou betekent dit dat e-mails die aan komen op de volgende e-mailadressen worden doorgestuurd:" #: templates/profile_configure_forwarding.html:65 msgid "And e-mail addresses of your committees and other groups." @@ -14513,9 +11370,7 @@ msgstr "En e-mailadressen van je commissies en andere groepen." msgid "Disable e-mail forwarding" msgstr "E-mailforwarding uitschakelen" -#: templates/profile_configure_forwarding.html:80 -#: templates/profile_configure_forwarding.html:153 -#: templates/profile_configure_forwarding.html:158 +#: templates/profile_configure_forwarding.html:80 templates/profile_configure_forwarding.html:153 templates/profile_configure_forwarding.html:158 msgid "E-mail forwarding is enabled. Forwarding to address: " msgstr "E-mailforwarding is ingeschakeld. Doorsturen naar adres: " @@ -14536,12 +11391,8 @@ msgid "Follow the steps below to enable e-mail forwarding:" msgstr "Volg de stappen hieronder om e-mailforwarding in te schakelen:" #: templates/profile_configure_forwarding.html:101 -msgid "" -"Just a second while we check the current status of your Google Suite " -"account..." -msgstr "" -"Een klein momentje terwijl we de huidige status van je Google Suite account " -"checken..." +msgid "Just a second while we check the current status of your Google Suite account..." +msgstr "Een klein momentje terwijl we de huidige status van je Google Suite account checken..." #: templates/profile_configure_forwarding.html:104 msgid "Step 2: Verify e-mail address" @@ -14551,22 +11402,15 @@ msgstr "Stap 2: E-mailadres verifiëren" #, python-format msgid "" "\n" -" Please check your e-mail on " -"%(personal_email)s. You should have received an e-mail\n" -" from Google with the request to forward " -"e-mails from your Inter-Actief addresses.\n" -" Please click on the link in that e-mail " -"to verify your address. The process will\n" -" continue automatically when your e-mail " -"has been verified.\n" +" Please check your e-mail on %(personal_email)s. You should have received an e-mail\n" +" from Google with the request to forward e-mails from your Inter-Actief addresses.\n" +" Please click on the link in that e-mail to verify your address. The process will\n" +" continue automatically when your e-mail has been verified.\n" " " msgstr "" "\n" -"Check a.u.b. je e-mail op %(personal_email)s. Je zou een e-mail moeten " -"hebben ontvangen van Google met de vraag of ze e-mails mogen forwarden van " -"je Inter-Actief-adressen.\n" -"Klik a.u.b. op de link in die e-mail om je adres te verifiëren. Het proces " -"gaat automatisch verder als je e-mailadres is geverifiëerd." +"Check a.u.b. je e-mail op %(personal_email)s. Je zou een e-mail moeten hebben ontvangen van Google met de vraag of ze e-mails mogen forwarden van je Inter-Actief-adressen.\n" +"Klik a.u.b. op de link in die e-mail om je adres te verifiëren. Het proces gaat automatisch verder als je e-mailadres is geverifiëerd." #: templates/profile_configure_forwarding.html:113 msgid "Step 3: Activate forwarding" @@ -14580,23 +11424,15 @@ msgstr "Een klein momentje terwijl we je forward activeren..." msgid "Just a second while we deactivate your forward..." msgstr "Een klein momentje terwijl we je forward deactiveren..." -#: templates/profile_configure_forwarding.html:142 -#: templates/profile_configure_forwarding.html:251 -msgid "" -"Something went wrong while activating your forward at Google. Please try " -"again later." -msgstr "" -"Er ging iets mis bij het activeren van je forward bij Google. Probeer het a." -"u.b. later opnieuw." +#: templates/profile_configure_forwarding.html:142 templates/profile_configure_forwarding.html:251 +msgid "Something went wrong while activating your forward at Google. Please try again later." +msgstr "Er ging iets mis bij het activeren van je forward bij Google. Probeer het a.u.b. later opnieuw." #: templates/profile_configure_forwarding.html:158 msgid "Error while checking the status at Google. Please try again later." -msgstr "" -"Error tijdens het checken van de status bij Google. Probeer het a.u.b. later " -"opnieuw." +msgstr "Error tijdens het checken van de status bij Google. Probeer het a.u.b. later opnieuw." -#: templates/profile_configure_forwarding.html:176 -#: templates/profile_configure_forwarding.html:185 +#: templates/profile_configure_forwarding.html:176 templates/profile_configure_forwarding.html:185 msgid "Activate forwarding" msgstr "Forwarding activeren" @@ -14609,20 +11445,12 @@ msgid "Add e-mail address" msgstr "E-mailadres toevoegen" #: templates/profile_configure_forwarding.html:202 -msgid "" -"Something went wrong while checking the status of your account at Google. " -"Please try again later." -msgstr "" -"Er ging iets mis bij het checken van de status van je account bij Google. " -"Probeer het a.u.b. later opnieuw." +msgid "Something went wrong while checking the status of your account at Google. Please try again later." +msgstr "Er ging iets mis bij het checken van de status van je account bij Google. Probeer het a.u.b. later opnieuw." #: templates/profile_configure_forwarding.html:232 -msgid "" -"Something went wrong while configuring your forward at Google. Please try " -"again later." -msgstr "" -"Er ging iets mis bij het instellen van je forward bij Google. Probeer het a." -"u.b. later opnieuw." +msgid "Something went wrong while configuring your forward at Google. Please try again later." +msgstr "Er ging iets mis bij het instellen van je forward bij Google. Probeer het a.u.b. later opnieuw." #: templates/profile_edit.html:5 templates/profile_edit.html:12 msgid "Change profile" @@ -14632,14 +11460,12 @@ msgstr "Wijzig profiel" msgid "" "\n" " This is the first time you log on to the website.\n" -" Before you continue, we would like to ask you to " -"check if the following data are still correct.\n" +" Before you continue, we would like to ask you to check if the following data are still correct.\n" " " msgstr "" "\n" "Dit is de eerste keer dat je inlogt op de website.\n" -"Voordat je verder gaat, vragen we je of je wilt controleren of de volgende " -"gegevens van jou nog correct zijn." +"Voordat je verder gaat, vragen we je of je wilt controleren of de volgende gegevens van jou nog correct zijn." #: templates/profile_edit.html:26 msgid "These data can always be changed in your profile later." @@ -14650,34 +11476,23 @@ msgid "Other contact information" msgstr "Overige contactgegevens" #: templates/profile_edit.html:51 -msgid "" -"Warning: When you change your e-mail address, you will need to " -"disable and re-enable e-mailforwarding via the button on your profile if you " -"have that enabled!" -msgstr "" -"Waarschuwing: Als je je e-mailadres aanpast, moet je ook je e-" -"mailforwarding uitzetten en weer aanzetten via de knop op je profiel als je " -"dat had ingesteld!" +msgid "Warning: When you change your e-mail address, you will need to disable and re-enable e-mailforwarding via the button on your profile if you have that enabled!" +msgstr "Waarschuwing: Als je je e-mailadres aanpast, moet je ook je e-mailforwarding uitzetten en weer aanzetten via de knop op je profiel als je dat had ingesteld!" #: templates/profile_edit.html:83 #, python-format msgid "" "\n" -" According to our administration you are currently " -"still enrolled for the bachelor %(study)s.\n" -" However, it is possible that you have already " -"completed this and started your master.\n" +" According to our administration you are currently still enrolled for the bachelor %(study)s.\n" +" However, it is possible that you have already completed this and started your master.\n" " If this is the case, please alert us.\n" -" It is also possible that you are already enrolled " -"for a master simultaneously.\n" +" It is also possible that you are already enrolled for a master simultaneously.\n" " " msgstr "" "\n" "Volgens ons sta je nog ingeschreven voor de bacheloropleiding %(study)s.\n" -"Het is echter mogelijk dat je deze al afgerond hebt en bezig bent met een " -"master.\n" -"Als dit zo is, kan je dat aangeven. Het kan ook zijn dat je al verweven een " -"master aan het doen bent.\n" +"Het is echter mogelijk dat je deze al afgerond hebt en bezig bent met een master.\n" +"Als dit zo is, kan je dat aangeven. Het kan ook zijn dat je al verweven een master aan het doen bent.\n" " " #: templates/profile_edit.html:100 @@ -14697,12 +11512,8 @@ msgid "Configure E-mail Forwarding" msgstr "E-mailforwarding Instellen" #: templates/profile_overview.html:35 -msgid "" -"Not satisfied with your looks? You can ask the board to change or delete " -"your profile picture." -msgstr "" -"Niet tevreden met je aangezicht? Vraag het bestuur om jouw pasfoto te " -"wijzigen of verwijderen." +msgid "Not satisfied with your looks? You can ask the board to change or delete your profile picture." +msgstr "Niet tevreden met je aangezicht? Vraag het bestuur om jouw pasfoto te wijzigen of verwijderen." #: templates/profile_overview.html:48 #, python-format @@ -14728,8 +11539,7 @@ msgstr "" #, python-format msgid "" "\n" -" Your membership fees have been paid through " -"%(payment_type)s on %(date)s.\n" +" Your membership fees have been paid through %(payment_type)s on %(date)s.\n" " " msgstr "" "\n" @@ -14738,52 +11548,36 @@ msgstr "" #: templates/profile_overview.html:66 msgid "" "\n" -" Your membership fee for this year has not yet " -"been paid.\n" -" If you have signed a direct debit mandate, this " -"will be arranged automatically.\n" +" Your membership fee for this year has not yet been paid.\n" +" If you have signed a direct debit mandate, this will be arranged automatically.\n" " " msgstr "" "\n" -"Je lidmaatschap voor dit jaar is nog niet betaald. Indien je een machtiging " -"hebt gegeven, dan wordt dit automatisch geregeld." +"Je lidmaatschap voor dit jaar is nog niet betaald. Indien je een machtiging hebt gegeven, dan wordt dit automatisch geregeld." #: templates/profile_overview.html:73 msgid "" "\n" -" Your student status has been verified, or we do not need " -"it for your membership type.\n" +" Your student status has been verified, or we do not need it for your membership type.\n" " " msgstr "" "\n" -"Je studentenstatus is geverifieerd of we hebben het niet nodig voor jouw " -"lidmaatschapstype." +"Je studentenstatus is geverifieerd of we hebben het niet nodig voor jouw lidmaatschapstype." #: templates/profile_overview.html:77 msgid "" "\n" -" Your student status has not been verified, while we do " -"need it for your membership type.\n" -" For your membership type, you have to be a student of " -"the study BIT, TCS or one of the connected masters.\n" -" In order to verify your student status at the UT, log " -"out and log in using your University of Twente account.\n" -" In case you are no longer eligible for the current " -"membership type, it will not be prolonged in July.\n" -" You can contact the Board in order to change your " -"membership type starting from then.\n" +" Your student status has not been verified, while we do need it for your membership type.\n" +" For your membership type, you have to be a student of the study BIT, TCS or one of the connected masters.\n" +" In order to verify your student status at the UT, log out and log in using your University of Twente account.\n" +" In case you are no longer eligible for the current membership type, it will not be prolonged in July.\n" +" You can contact the Board in order to change your membership type starting from then.\n" " " msgstr "" "\n" -"Jouw status als student is niet geverifieerd, terwijl we dit wel nodig " -"hebben voor jouw lidmaatschapstype. Voor jouw lidmaatschapstype moet je een " -"student zijn bij de studie BIT, TCS of een van de bijbehorende masters. Om " -"jouw status als student te verifiëren log je uit en log je vervolgens weer " -"in via jouw Universiteit Twente account.\n" -"Wanneer je niet meer voldoet aan de eisen voor jouw huidige lidmaatschap zal " -"het niet verlengd worden in juli.\n" -"Je kunt contact opnemen met het bestuur om je lidmaatschap vanaf 1 juli om " -"te zetten in een ander type lidmaatschap." +"Jouw status als student is niet geverifieerd, terwijl we dit wel nodig hebben voor jouw lidmaatschapstype. Voor jouw lidmaatschapstype moet je een student zijn bij de studie BIT, TCS of een van de bijbehorende masters. Om jouw status als student te verifiëren log je uit en log je vervolgens weer in via jouw Universiteit Twente account.\n" +"Wanneer je niet meer voldoet aan de eisen voor jouw huidige lidmaatschap zal het niet verlengd worden in juli.\n" +"Je kunt contact opnemen met het bestuur om je lidmaatschap vanaf 1 juli om te zetten in een ander type lidmaatschap." #: templates/profile_overview.html:88 msgid "" @@ -14797,15 +11591,12 @@ msgstr "" #: templates/profile_overview.html:145 msgid "" "\n" -" Below you can find an overview of your activism at Inter-" -"Actief.\n" -" Do you want to join a committee? Please contact our " -"functionary internal affairs.\n" +" Below you can find an overview of your activism at Inter-Actief.\n" +" Do you want to join a committee? Please contact our functionary internal affairs.\n" " " msgstr "" "\n" -"Hieronder staat een overzicht van je activisme bij Inter-Actief. Wil je " -"actief\n" +"Hieronder staat een overzicht van je activisme bij Inter-Actief. Wil je actief\n" "worden? Neem dan contact op met de intern." #: templates/profile_overview.html:155 @@ -14815,13 +11606,11 @@ msgstr "Apps" #: templates/profile_overview.html:159 msgid "" "\n" -" Below you can find an overview of the apps you have given " -"permissions to use or edit your personal information.\n" +" Below you can find an overview of the apps you have given permissions to use or edit your personal information.\n" " " msgstr "" "\n" -"Hieronder staat een overzicht van apps die toestemming hebben gekregen om je " -"gegevens te gebruiken of wijzigen." +"Hieronder staat een overzicht van apps die toestemming hebben gekregen om je gegevens te gebruiken of wijzigen." #: templates/profile_overview.html:170 msgid "User accounts and login providers" @@ -14829,16 +11618,11 @@ msgstr "Gebruikersaccounts en inlogproviders" #: templates/profile_overview.html:174 msgid "The following user account(s) have been found that are related to you." -msgstr "" -"De volgende gebruikersaccount(s) zijn gevonden die aan u gerelateerd zijn." +msgstr "De volgende gebruikersaccount(s) zijn gevonden die aan u gerelateerd zijn." #: templates/profile_overview.html:177 -msgid "" -"You can link another account by logging out, and logging back in with the " -"Google, LinkedIn or GitHub account you want to link." -msgstr "" -"U kunt een ander account koppelen door uit te loggen, en weer in te loggen " -"met het Google-, LinkedIn- of GitHub-account dat u wilt koppelen." +msgid "You can link another account by logging out, and logging back in with the Google, LinkedIn or GitHub account you want to link." +msgstr "U kunt een ander account koppelen door uit te loggen, en weer in te loggen met het Google-, LinkedIn- of GitHub-account dat u wilt koppelen." #: templates/profile_overview.html:182 msgid "Account type" @@ -14867,16 +11651,11 @@ msgstr "Geen TOTP-apparaten" #: templates/profile_overview.html:203 msgid "" "\n" -" To configure a TOTP device, log in " -"with your active members account and visit this page.\n" +" To configure a TOTP device, log in with your active members account and visit this page.\n" " " msgstr "" "\n" -"Om een TOTP-apparaat te configureren, log in met uw actieve ledenaccount en " -"ga naar deze pagina." +"Om een TOTP-apparaat te configureren, log in met uw actieve ledenaccount en ga naar deze pagina." #: templates/profile_overview.html:209 msgid "Integration account" @@ -14909,10 +11688,8 @@ msgstr "Onbekende gebruiker" #: templates/profile_unknown.html:15 msgid "" "\n" -" Hello, you are unknown in our administration, so you " -"cannot do much here.\n" -" The board is waiting for you if you want to change " -"this :-)\n" +" Hello, you are unknown in our administration, so you cannot do much here.\n" +" The board is waiting for you if you want to change this :-)\n" " " msgstr "" "\n" @@ -14930,14 +11707,12 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " Clicking on the television banner should allow " -#~ "you to edit it, but this feature has not been\n" +#~ " Clicking on the television banner should allow you to edit it, but this feature has not been\n" #~ " implemented yet.\n" #~ " " #~ msgstr "" #~ "\n" -#~ "Klik op een televisiebanner om hem aan te passen, deze feature is nog " -#~ "niet live™." +#~ "Klik op een televisiebanner om hem aan te passen, deze feature is nog niet live™." #~ msgid "Login provider %(provider)s added successfully" #~ msgstr "Login-provider %(provider)s succesvol toegevoegd" @@ -14945,15 +11720,11 @@ msgstr "Foto's toevoegen" #~ msgid "Login provider %(provider)s has been deleted" #~ msgstr "Login-provider %(provider)s is verdwijderd" -#~ msgid "" -#~ "You receive this e-mail because you can no longer login on the website of" -#~ msgstr "" -#~ "Je ontvangt deze e-mail omdat je niet (meer) kunt inloggen op de website " -#~ "van" +#~ msgid "You receive this e-mail because you can no longer login on the website of" +#~ msgstr "Je ontvangt deze e-mail omdat je niet (meer) kunt inloggen op de website van" #~ msgid "" -#~ "This is because you are not/no longer a student or employee of the " -#~ "University of Twente.\n" +#~ "This is because you are not/no longer a student or employee of the University of Twente.\n" #~ "\n" #~ "You can connect an external account through the following link:" #~ msgstr "" @@ -14964,16 +11735,12 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " You are here because yo do not have a way to log in " -#~ "to the Inter-Actief website (anymore).\n" -#~ " While you have been logged in now, it is wise to add " -#~ "an alternative login method below:\n" +#~ " You are here because yo do not have a way to log in to the Inter-Actief website (anymore).\n" +#~ " While you have been logged in now, it is wise to add an alternative login method below:\n" #~ " " #~ msgstr "" #~ "\n" -#~ "Je bent hier omdat je geen manier (meer) hebt om in te loggen bij de " -#~ "Inter-Actief-website. Alhoewel je nu bent ingelogd, is het " -#~ "verstanding om hieronder een alternatieve manier van inloggen te koppelen:" +#~ "Je bent hier omdat je geen manier (meer) hebt om in te loggen bij de Inter-Actief-website. Alhoewel je nu bent ingelogd, is het verstanding om hieronder een alternatieve manier van inloggen te koppelen:" #~ msgid "" #~ "\n" @@ -14988,14 +11755,12 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " Login with your Inter-Actief or " -#~ "University of Twente account to link it to\n" +#~ " Login with your Inter-Actief or University of Twente account to link it to\n" #~ " your external account.\n" #~ " " #~ msgstr "" #~ "\n" -#~ "Log in met uw Inter-Actief of Universiteit Twente account om deze " -#~ "te koppelen aan uw externe account." +#~ "Log in met uw Inter-Actief of Universiteit Twente account om deze te koppelen aan uw externe account." #~ msgid "Login providers" #~ msgstr "Login-providers" @@ -15013,8 +11778,7 @@ msgstr "Foto's toevoegen" #~ msgstr "Je hebt nog geen login-providers gekoppeld." #~ msgid "You can add another account to the following login providers:" -#~ msgstr "" -#~ "Je kunt hier (nog) een account koppelen aan de volgende login-providers:" +#~ msgstr "Je kunt hier (nog) een account koppelen aan de volgende login-providers:" #~ msgid "" #~ "\n" @@ -15027,18 +11791,11 @@ msgstr "Foto's toevoegen" #~ msgid "The login token does not exist or is expired." #~ msgstr "Het login-token is verlopen of bestaat niet." -#~ msgid "" -#~ "Your account is currently not linked to a user. Please contact the board." -#~ msgstr "" -#~ "Je gebruikersaccount is niet gekoppeld aan een user. Neem contact op met " -#~ "het bestuur." +#~ msgid "Your account is currently not linked to a user. Please contact the board." +#~ msgstr "Je gebruikersaccount is niet gekoppeld aan een user. Neem contact op met het bestuur." -#~ msgid "" -#~ "You can log in with your UTwente account, or your Inter-Actief " -#~ "account." -#~ msgstr "" -#~ "Je kunt inloggen met je UTwente-account, of met je Inter-Actief-" -#~ "account." +#~ msgid "You can log in with your UTwente account, or your Inter-Actief account." +#~ msgstr "Je kunt inloggen met je UTwente-account, of met je Inter-Actief-account." #~ msgid "Log in with UTwente" #~ msgstr "Inloggen met UTwente" @@ -15046,34 +11803,22 @@ msgstr "Foto's toevoegen" #~ msgid "Alternative login" #~ msgstr "Alternatieve login" -#~ msgid "" -#~ "Log in with your Inter-Actief or University of Twente account to " -#~ "link it to your external account." -#~ msgstr "" -#~ "Log in met uw Inter-Actief of Universiteit Twente account om deze " -#~ "te koppelen aan uw externe account." +#~ msgid "Log in with your Inter-Actief or University of Twente account to link it to your external account." +#~ msgstr "Log in met uw Inter-Actief of Universiteit Twente account om deze te koppelen aan uw externe account." #~ msgid "" #~ "\n" -#~ " Inter-Actief has a large number of " -#~ "committees which organize events.\n" +#~ " Inter-Actief has a large number of committees which organize events.\n" #~ " Every committee belongs to a specific category.\n" -#~ " For an overview of all committees, including " -#~ "inactive committees, see our\n" -#~ " committee booklet.\n" -#~ " At the moment Inter-Actief has the " -#~ "following committees:\n" +#~ " For an overview of all committees, including inactive committees, see our\n" +#~ " committee booklet.\n" +#~ " At the moment Inter-Actief has the following committees:\n" #~ " " #~ msgstr "" #~ "\n" -#~ "Inter-Actief kent een groot aantal commissies die activiteiten " -#~ "organiseren.\n" +#~ "Inter-Actief kent een groot aantal commissies die activiteiten organiseren.\n" #~ "Elke commissie behoort tot een bepaalde categorie.\n" -#~ "Voor een overzicht van alle commissies van Inter-Actief, " -#~ "inclusief nog te vormen commissies, zie ons commissieboekje.\n" +#~ "Voor een overzicht van alle commissies van Inter-Actief, inclusief nog te vormen commissies, zie ons commissieboekje.\n" #~ "Op dit moment bestaan de volgende commissies:" #~ msgid "For more information, have a look at the" @@ -15100,12 +11845,8 @@ msgstr "Foto's toevoegen" #~ msgid "AJAXPOST request required" #~ msgstr "AJAX-POST-request vereist" -#~ msgid "" -#~ "For this activity, you can only unenroll yourself at the board. You might " -#~ "want to edit your enrollment." -#~ msgstr "" -#~ "Voor deze activiteit kun je jezelf alleen via het bestuur uitschrijven. " -#~ "Je kunt wel je inschrijving aanpassen." +#~ msgid "For this activity, you can only unenroll yourself at the board. You might want to edit your enrollment." +#~ msgstr "Voor deze activiteit kun je jezelf alleen via het bestuur uitschrijven. Je kunt wel je inschrijving aanpassen." #~ msgid "Create shared drive" #~ msgstr "Gedeelde drive aanmaken" @@ -15139,10 +11880,8 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " Welcome to Microsoft Imagine for Inter-Actief " -#~ "members. Access to Microsoft Imagine is limited to\n" -#~ " students of the studies Computer Science, Business " -#~ "Information Technology and Telematics, their related Masters and\n" +#~ " Welcome to Microsoft Imagine for Inter-Actief members. Access to Microsoft Imagine is limited to\n" +#~ " students of the studies Computer Science, Business Information Technology and Telematics, their related Masters and\n" #~ " Computer Science faculty members.\n" #~ " " #~ msgstr "" @@ -15156,11 +11895,8 @@ msgstr "Foto's toevoegen" #~ msgid "Log into Microsoft Imagine" #~ msgstr "Inloggen op Microsoft Imagine" -#~ msgid "" -#~ "The connection to Microsoft Imagine has failed. Please try again later." -#~ msgstr "" -#~ "De verbinding met Microsoft Imagine is mislukt. Probeer het later " -#~ "nogmaals." +#~ msgid "The connection to Microsoft Imagine has failed. Please try again later." +#~ msgstr "De verbinding met Microsoft Imagine is mislukt. Probeer het later nogmaals." #~ msgid "Log on again to Microsoft Imagine" #~ msgstr "Opnieuw inloggen op Microsoft Imagine" @@ -15170,12 +11906,9 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " You don't have access to Microsoft Imagine. Access to " -#~ "Microsoft Imagine is limited to members of\n" -#~ " Inter-Actief and is limited to students for the " -#~ "studies Computer Science, Business Information Technology and\n" -#~ " Telematics, their related Masters and Computer Science " -#~ "faculty members.\n" +#~ " You don't have access to Microsoft Imagine. Access to Microsoft Imagine is limited to members of\n" +#~ " Inter-Actief and is limited to students for the studies Computer Science, Business Information Technology and\n" +#~ " Telematics, their related Masters and Computer Science faculty members.\n" #~ " " #~ msgstr "" #~ "\n" @@ -15220,13 +11953,11 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" #~ " Terms and conditions apply to the use of MSDNAA.\n" -#~ " Read these carefully before accepting them at the bottom " -#~ "of the page.\n" +#~ " Read these carefully before accepting them at the bottom of the page.\n" #~ " \t\t\t" #~ msgstr "" #~ "\n" -#~ "Het gebruik van MSDNAA is aan voorwaarden onderworpen. Lees deze " -#~ "aandachtig\n" +#~ "Het gebruik van MSDNAA is aan voorwaarden onderworpen. Lees deze aandachtig\n" #~ "door alvorens deze te accepteren, onderaan de pagina." #~ msgid "For the Microsoft Developer Network Academic Alliance Program" @@ -15264,17 +11995,13 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " \t\t\t\tThe overview below is an overview of all keys registered to the " -#~ "account of %(person)s.\n" -#~ " This overview does not show products that have a public " -#~ "key or do not require a key.\n" +#~ " \t\t\t\tThe overview below is an overview of all keys registered to the account of %(person)s.\n" +#~ " This overview does not show products that have a public key or do not require a key.\n" #~ " \t\t\t" #~ msgstr "" #~ "\n" -#~ "Onderstaand overzicht is een overzicht van alle keys die gekoppeld zijn " -#~ "aan de account van %(person)s.\n" -#~ "In dit overzicht worden geen producten getoond die een publieke key " -#~ "hebben\n" +#~ "Onderstaand overzicht is een overzicht van alle keys die gekoppeld zijn aan de account van %(person)s.\n" +#~ "In dit overzicht worden geen producten getoond die een publieke key hebben\n" #~ "of geen key nodig hebben." #~ msgid "Release" @@ -15295,50 +12022,29 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "Dear %(first_name)s,\n" #~ "\n" -#~ "You are receiving this mail because you have an active membership at " -#~ "Inter-Actief, and you have software\n" -#~ "license keys registered to your account from the MSDNAA section of our " -#~ "website.\n" +#~ "You are receiving this mail because you have an active membership at Inter-Actief, and you have software\n" +#~ "license keys registered to your account from the MSDNAA section of our website.\n" #~ "\n" -#~ "The MSDNAA (Microsoft Developer Network Academic Alliance) pages on our " -#~ "website have been (publicly) inaccessible for a while, and they will soon " -#~ "be\n" -#~ "completely removed from our website. Therefore, we are sending everyone " -#~ "their registered keys in case they might be needed in the future.\n" +#~ "The MSDNAA (Microsoft Developer Network Academic Alliance) pages on our website have been (publicly) inaccessible for a while, and they will soon be\n" +#~ "completely removed from our website. Therefore, we are sending everyone their registered keys in case they might be needed in the future.\n" #~ "\n" -#~ "The MSDNAA pages ( https://www.inter-actief.utwente.nl/msdnaa/ ) will be " -#~ "removed from our website from 1 march 2021.\n" -#~ "Please make sure to download any software you might need before then. Do " -#~ "note that most of these keys are for old software,\n" -#~ "which might not be supported any more, and we do not encourage using " -#~ "software that is not supported.\n" +#~ "The MSDNAA pages ( https://www.inter-actief.utwente.nl/msdnaa/ ) will be removed from our website from 1 march 2021.\n" +#~ "Please make sure to download any software you might need before then. Do note that most of these keys are for old software,\n" +#~ "which might not be supported any more, and we do not encourage using software that is not supported.\n" #~ "\n" -#~ "The following overview can also be found on https://www.inter-actief." -#~ "utwente.nl/msdnaa/mykeys/ (until 1 march 2021).\n" +#~ "The following overview can also be found on https://www.inter-actief.utwente.nl/msdnaa/mykeys/ (until 1 march 2021).\n" #~ "\n" #~ "These are the keys that are registered to you:" #~ msgstr "" #~ "Beste %(first_name)s,\n" #~ "\n" -#~ "Je krijgt deze mail omdat je een actief lidmaatschap hebt bij Inter-" -#~ "Actief, en omdat je softwarelicentiesleutels hebt geregistreerd door " -#~ "middel van de MSDNAA sectie van onze website.\n" +#~ "Je krijgt deze mail omdat je een actief lidmaatschap hebt bij Inter-Actief, en omdat je softwarelicentiesleutels hebt geregistreerd door middel van de MSDNAA sectie van onze website.\n" #~ "\n" -#~ "De MSDNAA (Microsoft Developer Network Academic Alliance) pagina's op " -#~ "onze website zijn al een tijdje (publiek) verborgen, en worden binnenkort " -#~ "volledig verwijderd. Daarom sturen we nu iedereen de licentiesleutels die " -#~ "aan hun accounts zijn gekoppeld, in het geval deze nog nodig zijn in de " -#~ "toekomst.\n" +#~ "De MSDNAA (Microsoft Developer Network Academic Alliance) pagina's op onze website zijn al een tijdje (publiek) verborgen, en worden binnenkort volledig verwijderd. Daarom sturen we nu iedereen de licentiesleutels die aan hun accounts zijn gekoppeld, in het geval deze nog nodig zijn in de toekomst.\n" #~ "\n" -#~ "De MSDNAA pagina's ( https://www.inter-actief.utwente.nl/msdnaa/ ) zullen " -#~ "verwijderd worden op 1 maart 2021. Zorg er a.u.b voor dat je voor deze " -#~ "datum de software hebt gedownload die je nog nodig hebt. Let wel op dat " -#~ "de meeste van deze sleutels voor verouderde software zijn, die mogelijk " -#~ "niet meer ondersteund wordt, en wij raden af om verouderde software te " -#~ "gebruiken.\n" +#~ "De MSDNAA pagina's ( https://www.inter-actief.utwente.nl/msdnaa/ ) zullen verwijderd worden op 1 maart 2021. Zorg er a.u.b voor dat je voor deze datum de software hebt gedownload die je nog nodig hebt. Let wel op dat de meeste van deze sleutels voor verouderde software zijn, die mogelijk niet meer ondersteund wordt, en wij raden af om verouderde software te gebruiken.\n" #~ "\n" -#~ "Het volgende overzicht kan (tot 1 maart 2020) ook gevonden worden op " -#~ "https://www.inter-actief.utwente.nl/msdnaa/mykeys/ .\n" +#~ "Het volgende overzicht kan (tot 1 maart 2020) ook gevonden worden op https://www.inter-actief.utwente.nl/msdnaa/mykeys/ .\n" #~ "\n" #~ "Dit zijn de licentiesleutels die voor jou geregistreerd staan:" @@ -15354,17 +12060,13 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " \t\t\t\tThe overview below is an overview of all keys registered to " -#~ "your account.\n" -#~ " This overview does not show products that have a public " -#~ "key or do not require a key.\n" +#~ " \t\t\t\tThe overview below is an overview of all keys registered to your account.\n" +#~ " This overview does not show products that have a public key or do not require a key.\n" #~ " \t\t\t" #~ msgstr "" #~ "\n" -#~ "Onderstaand overzicht is een overzicht van alle keys die gekoppeld zijn " -#~ "aan jouw\n" -#~ "account. In dit overzicht worden geen producten getoond die een publieke " -#~ "key hebben\n" +#~ "Onderstaand overzicht is een overzicht van alle keys die gekoppeld zijn aan jouw\n" +#~ "account. In dit overzicht worden geen producten getoond die een publieke key hebben\n" #~ "of geen key nodig hebben." #~ msgid "Access denied to MSDNAA" @@ -15372,36 +12074,25 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ " \t\t\t\tYou do not have access to MSDANAA. To use MSDNAA, you must fit " -#~ "the following criteria:\n" +#~ " \t\t\t\tYou do not have access to MSDANAA. To use MSDNAA, you must fit the following criteria:\n" #~ " \t\t\t" #~ msgstr "" #~ "\n" -#~ "Je hebt geen toegang tot MSDNAA. Om gebruik te kunnen maken van MSDNAA " -#~ "moet je voldoen aan de volgende voorwaarden:" +#~ "Je hebt geen toegang tot MSDNAA. Om gebruik te kunnen maken van MSDNAA moet je voldoen aan de volgende voorwaarden:" -#~ msgid "" -#~ "You are a student of INF, BIT or TEL (bachelor or master), or are an " -#~ "employee of the faculty EEMCS, department Computer Science." -#~ msgstr "" -#~ "Je bent student TI, BIT of TEL (bachelor of master) of je bent medewerker " -#~ "van de faculteit EWI afdeling Informatica." +#~ msgid "You are a student of INF, BIT or TEL (bachelor or master), or are an employee of the faculty EEMCS, department Computer Science." +#~ msgstr "Je bent student TI, BIT of TEL (bachelor of master) of je bent medewerker van de faculteit EWI afdeling Informatica." -#~ msgid "" -#~ "You are member of Inter-Actief and you have paid your membership " -#~ "fee." -#~ msgstr "" -#~ "Je bent lid van Inter-Actief en hebt je lidmaatschap betaald." +#~ msgid "You are member of Inter-Actief and you have paid your membership fee." +#~ msgstr "Je bent lid van Inter-Actief en hebt je lidmaatschap betaald." #~ msgid "" #~ "\n" -#~ " \t\t\t\tDo you fit the requirements, but still get this message? Please " -#~ "contact the board.\n" +#~ " \t\t\t\tDo you fit the requirements, but still get this message? Please contact the board.\n" #~ " \t\t\t" #~ msgstr "" #~ "\n" -#~ "Voldoe je wel aan de eisen, maar krijg je toch dit bericht? Neem dan " -#~ "contact op met het bestuur." +#~ "Voldoe je wel aan de eisen, maar krijg je toch dit bericht? Neem dan contact op met het bestuur." #~ msgid "Products in category " #~ msgstr "Producten in de categorie" @@ -15448,23 +12139,11 @@ msgstr "Foto's toevoegen" #~ msgid "Pre-enroll freshman member (do-group parents)" #~ msgstr "Eerstejaarslid voorinschrijven (dogroepouders)" -#~ msgid "" -#~ "Note: Only do groups of the most recent Kick-In are shown. If you did not " -#~ "participate in the Kick-In as a freshmen this academic year, leave this " -#~ "field blank." -#~ msgstr "" -#~ "Noot: Alleen doegroepen van de meest recente Kick-In worden laten zien. " -#~ "Als je niet deel hebt genomen aan de Kick-In als eerstejaars in dit " -#~ "academisch jaar, laat dit veld dan leeg." +#~ msgid "Note: Only do groups of the most recent Kick-In are shown. If you did not participate in the Kick-In as a freshmen this academic year, leave this field blank." +#~ msgstr "Noot: Alleen doegroepen van de meest recente Kick-In worden laten zien. Als je niet deel hebt genomen aan de Kick-In als eerstejaars in dit academisch jaar, laat dit veld dan leeg." -#~ msgid "" -#~ "Later during the Kick-In your enrollment will be finalized.
    This " -#~ "will be done by during the bachelor day, guided by people from Inter-" -#~ "Actief." -#~ msgstr "" -#~ "Later tijdens de Kick-In wordt je inschrijving afgerond.
    Dit wordt " -#~ "gedaan tijdens de bachelordag, begeleid door mensen van Inter-Actief." +#~ msgid "Later during the Kick-In your enrollment will be finalized.
    This will be done by during the bachelor day, guided by people from Inter-Actief." +#~ msgstr "Later tijdens de Kick-In wordt je inschrijving afgerond.
    Dit wordt gedaan tijdens de bachelordag, begeleid door mensen van Inter-Actief." #~ msgid "Thanks for becoming a member of Inter-Actief!" #~ msgstr "Bedankt dat je lid bent geworden bij Inter-Actief!" @@ -15484,12 +12163,8 @@ msgstr "Foto's toevoegen" #~ msgid "Heroes wanted!" #~ msgstr "Helden gezocht!" -#~ msgid "" -#~ "You have not signed a direct debit mandate. Please ask the board for a " -#~ "mandate form." -#~ msgstr "" -#~ "Je hebt geen machtiging getekend. Vraag het bestuur om een " -#~ "machtigingsformulier." +#~ msgid "You have not signed a direct debit mandate. Please ask the board for a mandate form." +#~ msgstr "Je hebt geen machtiging getekend. Vraag het bestuur om een machtigingsformulier." #~ msgid "Multiple unknown RFID-cards detected." #~ msgstr "Meerdere onbekende RFID-kaarten gescand." @@ -15533,12 +12208,8 @@ msgstr "Foto's toevoegen" #~ msgid "Import inbitween" #~ msgstr "Import inbitween" -#~ msgid "" -#~ "WARNING: The members of inbitween that you are about to import, may not " -#~ "yet exsist in the Inter-Actief databse! We do not check this!" -#~ msgstr "" -#~ "LET OP: De inbitweenleden die je op het punt staat om te importeren, " -#~ "mogen nog niet bestaan bij Inter-Actief! Er wordt niet op gecontroleerd!" +#~ msgid "WARNING: The members of inbitween that you are about to import, may not yet exsist in the Inter-Actief databse! We do not check this!" +#~ msgstr "LET OP: De inbitweenleden die je op het punt staat om te importeren, mogen nog niet bestaan bij Inter-Actief! Er wordt niet op gecontroleerd!" #~ msgid "First name:" #~ msgstr "Voornaam:" @@ -15624,63 +12295,23 @@ msgstr "Foto's toevoegen" #~ msgid "via inbitween" #~ msgstr "via inbitween" -#~ msgid "" -#~ "Your inbitween membership has been converted to an Inter-Actief " -#~ "membership because the financial settlement of the inbitween memberships " -#~ "is now handled by Inter-Actief, so payments will no longer be handled by " -#~ "Stress." -#~ msgstr "" -#~ "Je inbitween-lidmaatschap is omgezet naar een Inter-Actief-lidmaatschap " -#~ "omdat de financiële afhandeling van de inbitween-lidmaatschappen nu " -#~ "gedaan wordt door Inter-Actief, en de betalingen nu dus niet meer via " -#~ "Stress verlopen." +#~ msgid "Your inbitween membership has been converted to an Inter-Actief membership because the financial settlement of the inbitween memberships is now handled by Inter-Actief, so payments will no longer be handled by Stress." +#~ msgstr "Je inbitween-lidmaatschap is omgezet naar een Inter-Actief-lidmaatschap omdat de financiële afhandeling van de inbitween-lidmaatschappen nu gedaan wordt door Inter-Actief, en de betalingen nu dus niet meer via Stress verlopen." -#~ msgid "" -#~ "In case the above information is faulty, you can edit it at https://www." -#~ "inter-actief.net/profile/edit or by replying to this email. For questions " -#~ "you can also contact the board." -#~ msgstr "" -#~ "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www." -#~ "inter-actief.utwente.nl/profile/edit of door te reageren op deze mail. " -#~ "Voor vragen kun je contact opnemen met het bestuur." +#~ msgid "In case the above information is faulty, you can edit it at https://www.inter-actief.net/profile/edit or by replying to this email. For questions you can also contact the board." +#~ msgstr "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-actief.utwente.nl/profile/edit of door te reageren op deze mail. Voor vragen kun je contact opnemen met het bestuur." -#~ msgid "" -#~ "According to our administration you are no longer a member of inbitween. " -#~ "Therefore your membership of Inter-Actief will end on the first of July." -#~ msgstr "" -#~ "Omdat je volgens onze gegevens niet meer bent ingeschreven bij inbitween, " -#~ "wordt je lidmaatschap van Inter-Actief per 1 juli beëindigd." +#~ msgid "According to our administration you are no longer a member of inbitween. Therefore your membership of Inter-Actief will end on the first of July." +#~ msgstr "Omdat je volgens onze gegevens niet meer bent ingeschreven bij inbitween, wordt je lidmaatschap van Inter-Actief per 1 juli beëindigd." -#~ msgid "" -#~ "In case the above information is faulty, you can edit it at https://www." -#~ "inter-actief.utwente.nl/profiel/wijzigen or by replying to this " -#~ "email. For questions you can also contact the board." -#~ msgstr "" -#~ "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www." -#~ "inter-actief.utwente.nl/profiel/wijzigen of door te reageren op deze " -#~ "mail. Ook voor vragen kun je contact opnemen met het bestuur." +#~ msgid "In case the above information is faulty, you can edit it at https://www.inter-actief.utwente.nl/profiel/wijzigen or by replying to this email. For questions you can also contact the board." +#~ msgstr "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-actief.utwente.nl/profiel/wijzigen of door te reageren op deze mail. Ook voor vragen kun je contact opnemen met het bestuur." -#~ msgid "" -#~ "In case the above information is faulty, you can edit it at https://www." -#~ "inter-actief.net/profiel/wijzigen or by replying to this email. For " -#~ "questions you can also contact the board." -#~ msgstr "" -#~ "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www." -#~ "inter-actief.utwente.nl/profiel/wijzigen of door te reageren op deze " -#~ "mail. Ook voor vragen kun je contact opnemen met het bestuur." +#~ msgid "In case the above information is faulty, you can edit it at https://www.inter-actief.net/profiel/wijzigen or by replying to this email. For questions you can also contact the board." +#~ msgstr "Als bovenstaande gegevens onjuist zijn, kun je ze wijzigen op https://www.inter-actief.utwente.nl/profiel/wijzigen of door te reageren op deze mail. Ook voor vragen kun je contact opnemen met het bestuur." -#~ msgid "" -#~ "If you want to know more about ENIAC or if you want to become a member, " -#~ "send an email to bestuur@eniac.utwente.nl or take a look at www.eniac.utwente.nl." -#~ msgstr "" -#~ "Als je meer wilt weten over ENIAC of lid wil worden, mail dan naar bestuur@eniac.utwente.nl of " -#~ "kijk eens op www.eniac.utwente." -#~ "nl." +#~ msgid "If you want to know more about ENIAC or if you want to become a member, send an email to bestuur@eniac.utwente.nl or take a look at www.eniac.utwente.nl." +#~ msgstr "Als je meer wilt weten over ENIAC of lid wil worden, mail dan naar bestuur@eniac.utwente.nl of kijk eens op www.eniac.utwente.nl." #~ msgid "Page not found " #~ msgstr "Niet gevonden" @@ -15750,35 +12381,26 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "

    With this tool, the data of inbitween's member administration can be " -#~ "compared with Inter-Actief's.

    \n" +#~ "

    With this tool, the data of inbitween's member administration can be compared with Inter-Actief's.

    \n" #~ "\n" -#~ "

    You can import the CSV-file from inbitween's member administration. " -#~ "You can then check whether the data matches Inter-Actief's for " -#~ "each member of inbitween.

    \n" +#~ "

    You can import the CSV-file from inbitween's member administration. You can then check whether the data matches Inter-Actief's for each member of inbitween.

    \n" #~ msgstr "" #~ "\n" -#~ "

    Via deze tool kunnen de gegevens van de inbitween-ledenadministratie " -#~ "vergeleken worden met de Inter-Actief-ledenadministratie.

    \n" +#~ "

    Via deze tool kunnen de gegevens van de inbitween-ledenadministratie vergeleken worden met de Inter-Actief-ledenadministratie.

    \n" #~ "\n" -#~ "

    Je kunt de gegevens via een CSV-bestand importeren vanuit de inbitween-" -#~ "administratie. Vervolgens kun je per inbitween-lid zien of de gegevens " -#~ "overeenkomen met de gegevens van Inter-Actief.

    \n" +#~ "

    Je kunt de gegevens via een CSV-bestand importeren vanuit de inbitween-administratie. Vervolgens kun je per inbitween-lid zien of de gegevens overeenkomen met de gegevens van Inter-Actief.

    \n" #~ msgid "Import inbitween data" #~ msgstr "Import inbitween-gegevens" #~ msgid "" #~ "\n" -#~ "

    Through this page, you can import the data from the inbitween-databse, " -#~ "so they can be compared to Inter-Actief's data.

    \n" +#~ "

    Through this page, you can import the data from the inbitween-databse, so they can be compared to Inter-Actief's data.

    \n" #~ "\n" #~ "

    Upload the CSV-data from the inbitween-database below.

    \n" #~ msgstr "" #~ "\n" -#~ "

    Via deze pagina kunt je de gegevens uit de inbitween-database " -#~ "importeren, zodat deze vergeleken kunnen worden met de Inter-Actief-gegevens.

    \n" +#~ "

    Via deze pagina kunt je de gegevens uit de inbitween-database importeren, zodat deze vergeleken kunnen worden met de Inter-Actief-gegevens.

    \n" #~ "\n" #~ "

    Upload hieronder de CSV-gegevens uit de inbitween-database.

    \n" @@ -15788,21 +12410,14 @@ msgstr "Foto's toevoegen" #~ msgid "%(person)s in Inter-Actief's member administration" #~ msgstr "%(person)s in de Inter-Actief-ledenadministratie" -#~ msgid "" -#~ "This person has yet to be compared to the Inter-Actief " -#~ "administration. This process is carried out in the background." -#~ msgstr "" -#~ "Deze persoon is nog niet vergeleken met de Inter-Actief-" -#~ "administratie. Dit proces wordt in de achtergrond uitgevoerd." +#~ msgid "This person has yet to be compared to the Inter-Actief administration. This process is carried out in the background." +#~ msgstr "Deze persoon is nog niet vergeleken met de Inter-Actief-administratie. Dit proces wordt in de achtergrond uitgevoerd." #~ msgid "Add to the Inter-Actief member administration" #~ msgstr "Toevoegen aan de Inter-Actief-ledenadministratie" #~ msgid "This person's student number has been found in the " -#~ msgstr "" -#~ "Het studentnummer van deze persoon is meerdere keren gevonden in de Inter-" -#~ "Actief-ledenadministratie. Deze fout moet handmatig opgelost " -#~ "worden." +#~ msgstr "Het studentnummer van deze persoon is meerdere keren gevonden in de Inter-Actief-ledenadministratie. Deze fout moet handmatig opgelost worden." #~ msgid "Refresh" #~ msgstr "Vernieuwen" @@ -15831,14 +12446,8 @@ msgstr "Foto's toevoegen" #~ msgid "Members that were not found" #~ msgstr "Niet gevonden leden" -#~ msgid "" -#~ "The members listed below are in the Inter-Actief member " -#~ "administration as member of inbitween, but were not found in the " -#~ "inbitween member administration." -#~ msgstr "" -#~ "Onderstaande leden staan wel in de Inter-Actief-ledenadministratie " -#~ "als lid van inbitween, maar zijn niet gevonden in de inbitween-" -#~ "ledenadministratie." +#~ msgid "The members listed below are in the Inter-Actief member administration as member of inbitween, but were not found in the inbitween member administration." +#~ msgstr "Onderstaande leden staan wel in de Inter-Actief-ledenadministratie als lid van inbitween, maar zijn niet gevonden in de inbitween-ledenadministratie." #~ msgid "Calender" #~ msgstr "Kalender" @@ -15874,27 +12483,16 @@ msgstr "Foto's toevoegen" #~ msgstr "Geen onderwijsactiviteit" #~ msgid "Mails sent to us addressed to you will be forwarded to %(email)s" -#~ msgstr "" -#~ "Mail die naar ons gestuurd wordt voor jou, sturen wij door naar %(email)s" +#~ msgstr "Mail die naar ons gestuurd wordt voor jou, sturen wij door naar %(email)s" #~ msgid "Furthermore, all mail will be forwarded received on: %(alias)s" #~ msgstr "Tevens wordt alle mail doorgestuurd die wij krijgen op: %(alias)s" -#~ msgid "" -#~ "You can login to the IT systems in the Inter-Actief room, external file " -#~ "access, the Inter-Actief wiki and most other services." -#~ msgstr "" -#~ "Je kunt inloggen op de systemen in de Inter-Actief-kamer, externe " -#~ "bestandstoegang, de Inter-Actief-wiki en de meeste andere services." +#~ msgid "You can login to the IT systems in the Inter-Actief room, external file access, the Inter-Actief wiki and most other services." +#~ msgstr "Je kunt inloggen op de systemen in de Inter-Actief-kamer, externe bestandstoegang, de Inter-Actief-wiki en de meeste andere services." -#~ msgid "" -#~ "Still have questions? Visit http://wiki.inter-actief.utwente.nl/ for a " -#~ "FAQ, a guideline for printing on your laptop and more information. For " -#~ "even more questions you can just email us." -#~ msgstr "" -#~ "Heb je nog vragen? Op http://wiki.inter-actief.utwente.nl/ vindt je onder " -#~ "beheer onder andere een FAQ, een handleiding voor printen via je laptop " -#~ "en meer informatie. Voor vragen kun je ons natuurlijk ook altijd mailen." +#~ msgid "Still have questions? Visit http://wiki.inter-actief.utwente.nl/ for a FAQ, a guideline for printing on your laptop and more information. For even more questions you can just email us." +#~ msgstr "Heb je nog vragen? Op http://wiki.inter-actief.utwente.nl/ vindt je onder beheer onder andere een FAQ, een handleiding voor printen via je laptop en meer informatie. Voor vragen kun je ons natuurlijk ook altijd mailen." #~ msgid "Upcoming activities with external parties " #~ msgstr "Oude externe activiteiten" @@ -15921,30 +12519,13 @@ msgstr "Foto's toevoegen" #~ " Inloggen met %(backend)s\n" #~ " " -#~ msgid "" -#~ "\n" -#~ "For this activity, there is one place left." -#~ msgid_plural "" -#~ "\n" -#~ "For this activity there are %(places)s places left." -#~ msgstr[0] "" -#~ "\n" -#~ " Voor deze activiteit is nog 1 plaats beschikbaar.\n" -#~ " " -#~ msgstr[1] "" -#~ "\n" -#~ " Voor deze activiteit zijn nog %(places)s plaatsen " -#~ "beschikbaar.\n" -#~ " " - #~ msgid "" #~ "\n" #~ "For this activity, there are %(places)s places left.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Voor deze activiteit zijn nog %(places)s " -#~ "plaatsen beschikbaar.\n" +#~ " Voor deze activiteit zijn nog %(places)s plaatsen beschikbaar.\n" #~ " " #~ msgid "" @@ -15966,12 +12547,10 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "Because you have submitted an exam paper, you may spend %(credit)s on " -#~ "consumptions." +#~ "Because you have submitted an exam paper, you may spend %(credit)s on consumptions." #~ msgstr "" #~ "\n" -#~ " Omdat je tentamens hebt ingeleverd, mag je nog " -#~ "voor\n" +#~ " Omdat je tentamens hebt ingeleverd, mag je nog voor\n" #~ " %(credit)s aan koeken kopen.\n" #~ " " @@ -16029,23 +12608,17 @@ msgstr "Foto's toevoegen" #~ "Are you sure you want to remove the office duty %(kamerdienst)s?" #~ msgstr "" #~ "\n" -#~ " Weet je zeker dat je de kamerdienst %(kamerdienst)s wilt " -#~ "verwijderen?\n" +#~ " Weet je zeker dat je de kamerdienst %(kamerdienst)s wilt verwijderen?\n" #~ " " #~ msgid "Detected faces:" #~ msgstr "Gedetecteerde gezichten:" #~ msgid "I give the association permission to process my personal details." -#~ msgstr "" -#~ "Ik geef de vereniging toestemming om mijn persoonlijke gegevens te " -#~ "verwerken." +#~ msgstr "Ik geef de vereniging toestemming om mijn persoonlijke gegevens te verwerken." -#~ msgid "" -#~ "The privacy document can always be found again at the bottom of our " -#~ "website." -#~ msgstr "" -#~ "De privacyverklaring is ook altijd terug te vinden onderaan onze website." +#~ msgid "The privacy document can always be found again at the bottom of our website." +#~ msgstr "De privacyverklaring is ook altijd terug te vinden onderaan onze website." #~ msgid "Mobile phone" #~ msgstr "Telefoon mobiel" @@ -16105,44 +12678,27 @@ msgstr "Foto's toevoegen" #~ msgid "1243 AB, Enschede, Optional" #~ msgstr "1234 AB, Enschede, Niet verplicht" -#~ msgid "" -#~ "If you are going to study B-BIT or M-BIT, you will have to subscribe at " -#~ "inbitween. If this is the case, stop filling out this form and ask the " -#~ "board!" -#~ msgstr "" -#~ "Als je B-BIT of M-BIT gaat studeren, dan moet je je bij inbitween " -#~ "inschrijven. In dat geval: stop nu met dit formulier en vraag het bestuur!" +#~ msgid "If you are going to study B-BIT or M-BIT, you will have to subscribe at inbitween. If this is the case, stop filling out this form and ask the board!" +#~ msgstr "Als je B-BIT of M-BIT gaat studeren, dan moet je je bij inbitween inschrijven. In dat geval: stop nu met dit formulier en vraag het bestuur!" #~ msgid "0123456 (without s)" #~ msgstr "0123456 (zonder s)" #~ msgid "" #~ "\n" -#~ "There are two types of membership; yearlong and for the duration of your " -#~ "studies. A yearlong membership costs € %(year_member_costs)sper year.\n" -#~ "A studylong membership is valid as long as are a student of Computer " -#~ "Science or Business Information Technology and costs € " -#~ "%(study_long_member_costs)s.\n" +#~ "There are two types of membership; yearlong and for the duration of your studies. A yearlong membership costs € %(year_member_costs)sper year.\n" +#~ "A studylong membership is valid as long as are a student of Computer Science or Business Information Technology and costs € %(study_long_member_costs)s.\n" #~ msgstr "" #~ "\n" -#~ "Er zijn twee soorten lidmaatschap: jaarlid en studielang lid. Een " -#~ "jaarlidmaatschap kost € %(year_member_costs)s per jaar.
    \n" -#~ "Een studielang lidmaatschap is geldig zolang je Technische Informatica of " -#~ "Business Information Technology studeert en kost € " -#~ "%(study_long_member_costs)s.\n" +#~ "Er zijn twee soorten lidmaatschap: jaarlid en studielang lid. Een jaarlidmaatschap kost € %(year_member_costs)s per jaar.
    \n" +#~ "Een studielang lidmaatschap is geldig zolang je Technische Informatica of Business Information Technology studeert en kost € %(study_long_member_costs)s.\n" #~ msgid "" #~ "\n" -#~ "You pay for your membership when via collection. If you chose a yearlong " -#~ "membership, you can authorize the association to collect your membership " -#~ "fee from your bank account in the coming years. Your membership will " -#~ "automatically be updated until you cancel it.\n" +#~ "You pay for your membership when via collection. If you chose a yearlong membership, you can authorize the association to collect your membership fee from your bank account in the coming years. Your membership will automatically be updated until you cancel it.\n" #~ msgstr "" #~ "\n" -#~ "Je moet je lidmaatschap per machtiging betalen. Indien je een " -#~ "jaarlidmaatschap hebt gekozen, machtig je de vereniging om in de komende " -#~ "jaren het geld van je rekening af te laten schrijven. Je lidmaatschap " -#~ "wordt dan elk jaar - totdat je opzegt - automatisch verlengd.\n" +#~ "Je moet je lidmaatschap per machtiging betalen. Indien je een jaarlidmaatschap hebt gekozen, machtig je de vereniging om in de komende jaren het geld van je rekening af te laten schrijven. Je lidmaatschap wordt dan elk jaar - totdat je opzegt - automatisch verlengd.\n" #~ msgid "" #~ "\n" @@ -16155,13 +12711,10 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "The way your data is processed, is explained in our articles of " -#~ "association. For more information, ask the board.\n" +#~ "The way your data is processed, is explained in our articles of association. For more information, ask the board.\n" #~ msgstr "" #~ "\n" -#~ "Hoe jouw gegevens verwerkt mogen worden, is toegelicht in onze " -#~ "verenigingsdocumenten. Voor meer informatie kun je het bestuur " -#~ "raadplegen.\n" +#~ "Hoe jouw gegevens verwerkt mogen worden, is toegelicht in onze verenigingsdocumenten. Voor meer informatie kun je het bestuur raadplegen.\n" #~ msgid "Enrollment Inter-Actief" #~ msgstr "Inschrijving Inter-Actief" @@ -16174,25 +12727,15 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "You pay for your membership through collection. If you chose a yearlong " -#~ "membership, you can authorize the association to collect your membership " -#~ "fee from your bank account in the coming years. Your membership will " -#~ "automatically be updated until you cancel it.\n" +#~ "You pay for your membership through collection. If you chose a yearlong membership, you can authorize the association to collect your membership fee from your bank account in the coming years. Your membership will automatically be updated until you cancel it.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Je moet je lidmaatschap per machtiging betalen. Indien je een " -#~ "jaarlidmaatschap hebt gekozen, machtig je de vereniging om in de komende " -#~ "jaren het geld van je rekening af te laten schrijven. Je lidmaatschap " -#~ "wordt dan elk jaar - totdat je opzegt - automatisch verlengd.\n" +#~ " Je moet je lidmaatschap per machtiging betalen. Indien je een jaarlidmaatschap hebt gekozen, machtig je de vereniging om in de komende jaren het geld van je rekening af te laten schrijven. Je lidmaatschap wordt dan elk jaar - totdat je opzegt - automatisch verlengd.\n" #~ " " -#~ msgid "" -#~ "I authorize the association to collect my membership fee from my bank " -#~ "account yearly, until I cancel my membership." -#~ msgstr "" -#~ "Ik machtig de vereniging om tot opzegging jaarlijks het lidmaatschap van " -#~ "mijn rekening af te schrijven." +#~ msgid "I authorize the association to collect my membership fee from my bank account yearly, until I cancel my membership." +#~ msgstr "Ik machtig de vereniging om tot opzegging jaarlijks het lidmaatschap van mijn rekening af te schrijven." #~ msgid "" #~ "\n" @@ -16215,12 +12758,10 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "That's it. Please double check your information and send the form. There " -#~ "is a PDF document in your mail for you to print out and sign.\n" +#~ "That's it. Please double check your information and send the form. There is a PDF document in your mail for you to print out and sign.\n" #~ msgstr "" #~ "\n" -#~ "Dat was het. Controleer je gegevens en verstuur het formulier. Je krijgt " -#~ "een PDF-document opgestuurd dat je mag uitprinten en ondertekenen.\n" +#~ "Dat was het. Controleer je gegevens en verstuur het formulier. Je krijgt een PDF-document opgestuurd dat je mag uitprinten en ondertekenen.\n" #~ msgid "Send an SMS" #~ msgstr "Stuur een SMS" @@ -16233,23 +12774,18 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "Pay attention: There are people selected who don't want to receive " -#~ "a SMS!" +#~ "Pay attention: There are people selected who don't want to receive a SMS!" #~ msgstr "" #~ "\n" -#~ "\t Let op: Er zijn personen geselecteerd die " -#~ "geen SMS willen ontvangen!\n" +#~ "\t Let op: Er zijn personen geselecteerd die geen SMS willen ontvangen!\n" #~ "\t " #~ msgid "" #~ "\n" -#~ "There are %(count)s people selected. The variable ontvanger contains data " -#~ "of every receiver. It can be used as follows:" +#~ "There are %(count)s people selected. The variable ontvanger contains data of every receiver. It can be used as follows:" #~ msgstr "" #~ "\n" -#~ " Er zijn %(count)s personen geselecteerd. De variabele " -#~ "ontvanger bevat de gegevens van iedere ontvanger. Deze is als volgt te " -#~ "gebruiken:\n" +#~ " Er zijn %(count)s personen geselecteerd. De variabele ontvanger bevat de gegevens van iedere ontvanger. Deze is als volgt te gebruiken:\n" #~ " " #~ msgid "First push, than SMS" @@ -16275,23 +12811,17 @@ msgstr "Foto's toevoegen" #~ "You are about to log in at %(name)s." #~ msgstr "" #~ "\n" -#~ " U staat op het punt om in te loggen bij " -#~ "%(name)s.\n" +#~ " U staat op het punt om in te loggen bij %(name)s.\n" #~ " " #~ msgid "" #~ "\n" -#~ "By clicking on 'Accept' you give %(name)s and Inter-Actief the " -#~ "permission to use your data in accordance with the respective privacy " -#~ "policies." +#~ "By clicking on 'Accept' you give %(name)s and Inter-Actief the permission to use your data in accordance with the respective privacy policies." #~ msgstr "" #~ "\n" -#~ " Als u op 'Accepteren' klikt, geeft u %(name)s en " -#~ "Inter-Actief toestemming uw\n" -#~ " gegevens te gebruiken in overeenstemming met de " -#~ "betreffende privacybeleidsregels.\n" -#~ " \n" +#~ " Als u op 'Accepteren' klikt, geeft u %(name)s en Inter-Actief toestemming uw\n" +#~ " gegevens te gebruiken in overeenstemming met de betreffende privacybeleidsregels.\n" +#~ " \n" #~ " " #~ msgid "Refuse" @@ -16311,13 +12841,11 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "The credentials you used have already been linked to another Inter-" -#~ "Actief member.\n" +#~ "The credentials you used have already been linked to another Inter-Actief member.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " De door u gebruikte inloggegevens zijn reeds aan " -#~ "een ander Inter-Actief lid gekoppeld.\n" +#~ " De door u gebruikte inloggegevens zijn reeds aan een ander Inter-Actief lid gekoppeld.\n" #~ " " #~ msgid "Order" @@ -16361,8 +12889,7 @@ msgstr "Foto's toevoegen" #~ "Check your message before you send it." #~ msgstr "" #~ "\n" -#~ "\t Controleer je bericht goed voordat je deze " -#~ "daadwerkelijk verzend.\n" +#~ "\t Controleer je bericht goed voordat je deze daadwerkelijk verzend.\n" #~ "\t " #~ msgid "Page %(number)s of %(num_pages)s." @@ -16400,9 +12927,6 @@ msgstr "Foto's toevoegen" #~ msgid "This message has to remain visible" #~ msgstr "Dit bericht moet zichtbaar blijven" -#~ msgid "The enrollment for this activity is full" -#~ msgstr "De inschrijving voor deze activiteit is vol." - #~ msgid "There are" #~ msgstr "Er zijn nog" @@ -16459,27 +12983,21 @@ msgstr "Foto's toevoegen" #~ msgid "" #~ "\n" -#~ "If you have selected \"marking period exceeded\", you do not need to fill " -#~ "out the following fields. If not, please state clearly what the problem " -#~ "is:" +#~ "If you have selected \"marking period exceeded\", you do not need to fill out the following fields. If not, please state clearly what the problem is:" #~ msgstr "" #~ "\n" -#~ " Als je \"nakijktermijn verstreken\" hebt " -#~ "geselecteerd, zijn de\n" -#~ " volgende velden niet direct nodig, maar anders: " -#~ "vertel ons helder wat\n" +#~ " Als je \"nakijktermijn verstreken\" hebt geselecteerd, zijn de\n" +#~ " volgende velden niet direct nodig, maar anders: vertel ons helder wat\n" #~ " er aan de hand is:\n" #~ " " #~ msgid "" #~ "\n" -#~ "Page %(onderwijsnieuws.number)s of %(onderwijsnieuws.paginator." -#~ "num_pages)s.\n" +#~ "Page %(onderwijsnieuws.number)s of %(onderwijsnieuws.paginator.num_pages)s.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Pagina %(onderwijsnieuws.number)s van " -#~ "%(onderwijsnieuws.paginator.num_pages)s.\n" +#~ " Pagina %(onderwijsnieuws.number)s van %(onderwijsnieuws.paginator.num_pages)s.\n" #~ " " #~ msgid "" @@ -16490,8 +13008,7 @@ msgstr "Foto's toevoegen" #~ msgstr "" #~ "\n" #~ " Als je er ook bij wilt zijn moet je je inschrijven.\n" -#~ " Inschrijven kan nog tot uiterlijk %(einddatum)s om " -#~ "%(eindtijd)s.\n" +#~ " Inschrijven kan nog tot uiterlijk %(einddatum)s om %(eindtijd)s.\n" #~ " " #~ msgid "Photos of recent events" @@ -16520,20 +13037,17 @@ msgstr "Foto's toevoegen" #~ " " #~ msgstr "" #~ "\n" -#~ " Je kunt je niet meer inschrijven, alle plaatsen " -#~ "zijn vergeven.\n" +#~ " Je kunt je niet meer inschrijven, alle plaatsen zijn vergeven.\n" #~ " " #~ msgid "" #~ "You receive this e-mail report because you send an SMS-mailing.\n" #~ "\n" -#~ "The following SMS has been send (possible variables have been filled with " -#~ "the last person):" +#~ "The following SMS has been send (possible variables have been filled with the last person):" #~ msgstr "" #~ "Je ontvangt dit e-mailrapport omdat je een SMS-mailing verstuurd hebt.\n" #~ "\n" -#~ "De volgende SMS is verstuurd (eventule variabelen zijn nu opgevuld met " -#~ "de\n" +#~ "De volgende SMS is verstuurd (eventule variabelen zijn nu opgevuld met de\n" #~ "laatste persoon):" #~ msgid "\n" @@ -16559,15 +13073,13 @@ msgstr "Foto's toevoegen" #~ "\t\t\t" #~ msgstr "" #~ "\n" -#~ "\t\t\t\tVoor deze activiteit zijn nog %(plaatsen)s plaatsen " -#~ "beschikbaar. \n" +#~ "\t\t\t\tVoor deze activiteit zijn nog %(plaatsen)s plaatsen beschikbaar. \n" #~ "\t\t\t\tAls je er ook bij wilt zijn moet je je inschrijven.\n" #~ "\t\t\t" #~ msgid "" #~ "\n" -#~ " We're sorry, this event is full. The maximum number of " -#~ "%(maximum) participants is reached. \n" +#~ " We're sorry, this event is full. The maximum number of %(maximum) participants is reached. \n" #~ " " #~ msgstr "" #~ "\n" @@ -16581,22 +13093,17 @@ msgstr "Foto's toevoegen" #~ " " #~ msgstr "" #~ "\n" -#~ " Er zijn geen werkgroepen ingesteld voor dit " -#~ "vak, \n" +#~ " Er zijn geen werkgroepen ingesteld voor dit vak, \n" #~ " doe dit eerst als deze wel bestaan. \n" #~ " " #~ msgid "" #~ "\n" -#~ "I.C.T.S.V. Inter-Actief is de study association for the bachelor " -#~ "and master studies of Computer Science and Business Information " -#~ "Technology of the University of Twente." +#~ "I.C.T.S.V. Inter-Actief is de study association for the bachelor and master studies of Computer Science and Business Information Technology of the University of Twente." #~ msgstr "" #~ "\n" -#~ " I.C.T.S.V. Inter-Actief is de " -#~ "studievereniging voor de bachelor- en masteropleidingen van\n" -#~ " Technische Informatica en Business Information " -#~ "Technology aan de Universiteit Twente.\n" +#~ " I.C.T.S.V. Inter-Actief is de studievereniging voor de bachelor- en masteropleidingen van\n" +#~ " Technische Informatica en Business Information Technology aan de Universiteit Twente.\n" #~ " " #~ msgid "" @@ -16604,20 +13111,16 @@ msgstr "Foto's toevoegen" #~ "You can still uncheck or change classes before you save them." #~ msgstr "" #~ "\n" -#~ " Je kunt colleges nog uitvinken of veranderen " -#~ "voordat je ze opslaat.\n" +#~ " Je kunt colleges nog uitvinken of veranderen voordat je ze opslaat.\n" #~ " " #~ msgid "" #~ "\n" -#~ "You can add weekly classes here. Please fill out the field, click \"Next" -#~ "\", check the proposal and confirm." +#~ "You can add weekly classes here. Please fill out the field, click \"Next\", check the proposal and confirm." #~ msgstr "" #~ "\n" -#~ " Je kunt hier een college dat wekelijks terugkomt " -#~ "toevoegen. Vul de gegevens in, \n" -#~ " klik 'Verder', controleer het voorstel en " -#~ "bevestig. \n" +#~ " Je kunt hier een college dat wekelijks terugkomt toevoegen. Vul de gegevens in, \n" +#~ " klik 'Verder', controleer het voorstel en bevestig. \n" #~ " " #~ msgid "" @@ -16625,23 +13128,18 @@ msgstr "Foto's toevoegen" #~ "This page consists of two parts. " #~ msgstr "" #~ "\n" -#~ " Deze pagina bestaat uit twee delen. Allereerst staan " -#~ "hieronder de colleges zoals \n" -#~ " die nu in het systeem staan. Hier kun je zaalwijzigingen " -#~ "etcetera doen, colleges \n" +#~ " Deze pagina bestaat uit twee delen. Allereerst staan hieronder de colleges zoals \n" +#~ " die nu in het systeem staan. Hier kun je zaalwijzigingen etcetera doen, colleges \n" #~ " weghalen of enkele toevoegen.\n" #~ " " #~ msgid "" #~ "\n" -#~ "The second part is useful is this is the first time you are adding " -#~ "classes. You can set which classes you have for the whole term." +#~ "The second part is useful is this is the first time you are adding classes. You can set which classes you have for the whole term." #~ msgstr "" #~ "\n" -#~ " Het tweede deel is nuttig als je de colleges voor het " -#~ "eerst invult. Je kunt voor \n" -#~ " dehele periode instellen welke colleges je elke week " -#~ "hebt.\n" +#~ " Het tweede deel is nuttig als je de colleges voor het eerst invult. Je kunt voor \n" +#~ " dehele periode instellen welke colleges je elke week hebt.\n" #~ " " #~ msgid "" @@ -16665,93 +13163,60 @@ msgstr "Foto's toevoegen" #~ "To add a new course, enter the course ID and we'll check Osiris for you." #~ msgstr "" #~ "\n" -#~ " Om een nieuw vak toe te voegen, moet je eerst de vakcode invullen " -#~ "en dan kijken we even voor je in Osiris.\n" +#~ " Om een nieuw vak toe te voegen, moet je eerst de vakcode invullen en dan kijken we even voor je in Osiris.\n" #~ " " #~ msgid "" #~ "\n" -#~ " If students cannot be found it will be checked if they may still be a " -#~ "member.This can also be done retrospectively for this academic year. \n" +#~ " If students cannot be found it will be checked if they may still be a member.This can also be done retrospectively for this academic year. \n" #~ " " #~ msgstr "" #~ "\n" -#~ " Als studenten niet meer teruggevonden kunnen worden zal gekeken " -#~ "worden of zij nog lid mogen zijn. Dit kan ook met terugwerkende kracht " -#~ "gebeuren voor dit collegejaar gebeuren.\n" +#~ " Als studenten niet meer teruggevonden kunnen worden zal gekeken worden of zij nog lid mogen zijn. Dit kan ook met terugwerkende kracht gebeuren voor dit collegejaar gebeuren.\n" #~ " " #~ msgid "" #~ "\n" -#~ " This script can't check if people study a non-primary Inter-Actief " -#~ "study.\n" +#~ " This script can't check if people study a non-primary Inter-Actief study.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Dit script kan natuurlijk niet controleren of mensen nog een niet-" -#~ "hoofdstudie doen.\n" +#~ " Dit script kan natuurlijk niet controleren of mensen nog een niet-hoofdstudie doen.\n" #~ " " #~ msgid "" #~ "\n" -#~ " With this tool you can check all students of a primary Inter-Actief " -#~ "study.Fill in what you get from BOZ-INF as current students andthe script " -#~ "will check which students switched study or stopped studying.\n" +#~ " With this tool you can check all students of a primary Inter-Actief study.Fill in what you get from BOZ-INF as current students andthe script will check which students switched study or stopped studying.\n" #~ " " #~ msgstr "" #~ "\n" -#~ " Met dit hulpstuk kun je alle studenten van de hoofdstudies " -#~ "controleren. Vul hieronder in wat je van BOZ-INF krijgt als zijnde " -#~ "huidige studenten en het script gaat kijken welke mensen geswitcht zijn " -#~ "van studie, welke mensen niet meer studeren, enzovoorts.\n" +#~ " Met dit hulpstuk kun je alle studenten van de hoofdstudies controleren. Vul hieronder in wat je van BOZ-INF krijgt als zijnde huidige studenten en het script gaat kijken welke mensen geswitcht zijn van studie, welke mensen niet meer studeren, enzovoorts.\n" #~ " " #~ msgid "" #~ "\n" -#~ "

    Transferring a year is useful to transfer all \"automatic\" members " -#~ "to the new year. In this case, it would mean that all memberships that " -#~ "have no costs (for example, honarary members or people who are a member " -#~ "for the entire time they study) would get a new membership in the " -#~ "academic year of %(jaar)s, if they do not have one yet.

    \n" +#~ "

    Transferring a year is useful to transfer all \"automatic\" members to the new year. In this case, it would mean that all memberships that have no costs (for example, honarary members or people who are a member for the entire time they study) would get a new membership in the academic year of %(jaar)s, if they do not have one yet.

    \n" #~ "\n" -#~ "

    People who have authorized the " -#~ "association will receive a membership, but have not yet paid. The system " -#~ "will treat them as members, but technically these people are no longer " -#~ "members, untill the payment has been made. A free membership does not " -#~ "need payment, these people are automattically a \"full\" member again.

    \n" +#~ "

    People who have authorized the association will receive a membership, but have not yet paid. The system will treat them as members, but technically these people are no longer members, untill the payment has been made. A free membership does not need payment, these people are automattically a \"full\" member again.

    \n" #~ msgstr "" #~ "\n" -#~ "

    Een jaar overzetten is nuttig om alle 'automatische' leden om te " -#~ "zetten naar het nieuwe jaar. In dit geval zou het betekenen dat alle " -#~ "lidmaatschappen zonder kosten (bijvoorbeeld studielang of ereleden) en " -#~ "alle mensen die de vereniging gemachtigd hebben, een nieuw lidmaatschap " -#~ "krijgen voor het collegejaar %(jaar)s, als ze deze nog niet hebben.

    \n" +#~ "

    Een jaar overzetten is nuttig om alle 'automatische' leden om te zetten naar het nieuwe jaar. In dit geval zou het betekenen dat alle lidmaatschappen zonder kosten (bijvoorbeeld studielang of ereleden) en alle mensen die de vereniging gemachtigd hebben, een nieuw lidmaatschap krijgen voor het collegejaar %(jaar)s, als ze deze nog niet hebben.

    \n" #~ "\n" -#~ "

    Mensen die de vereniging gemachtigd " -#~ "hebben, krijgen een lidmaatschap, maar hebben nog niet betaald. Het " -#~ "systeem zal ze als lid behandelen, maar in stricte zin zijn deze mensen " -#~ "niet lid (meer), totdat de betaling ingevoerd is. Een kostenloos " -#~ "lidmaatschap heeft geen betaling nodig, deze mensen zijn direct weer " -#~ "'volledig' lid.

    \n" +#~ "

    Mensen die de vereniging gemachtigd hebben, krijgen een lidmaatschap, maar hebben nog niet betaald. Het systeem zal ze als lid behandelen, maar in stricte zin zijn deze mensen niet lid (meer), totdat de betaling ingevoerd is. Een kostenloos lidmaatschap heeft geen betaling nodig, deze mensen zijn direct weer 'volledig' lid.

    \n" #~ msgid "" #~ "\n" -#~ "Master courses are shown in English, bachelor courses are shown in " -#~ "Dutch.\n" +#~ "Master courses are shown in English, bachelor courses are shown in Dutch.\n" #~ msgstr "" #~ "\n" -#~ "Studies die hieronder in het Engels zijn weergegeven, zijn Masters, de " -#~ "Nederlandse, Bacheloropleidingen.\n" +#~ "Studies die hieronder in het Engels zijn weergegeven, zijn Masters, de Nederlandse, Bacheloropleidingen.\n" #~ msgid "" #~ "\n" -#~ "Welcome at Inter-Actief! To enroll at the study " -#~ "associationPlease fill in this form.\n" +#~ "Welcome at Inter-Actief! To enroll at the study associationPlease fill in this form.\n" #~ msgstr "" #~ "\n" -#~ "Welkom bij Inter-Actief! Om je in te schrijven als in lid van de " -#~ "vereniging, willen wij graag wat dingen van jou weten.\n" +#~ "Welkom bij Inter-Actief! Om je in te schrijven als in lid van de vereniging, willen wij graag wat dingen van jou weten.\n" #~ msgid "" #~ " \n" @@ -16780,12 +13245,8 @@ msgstr "Foto's toevoegen" #~ msgid "8th/9th period" #~ msgstr "8e/9e uur" -#~ msgid "" -#~ "Because these will be on PDF-schedules, please use the building's " -#~ "abbreviation instead of its full name" -#~ msgstr "" -#~ "Aangezien deze op PDF-roosters komen, is het verstandig de afkorting van " -#~ "een gebouw te gebruiken ivm de ruimte" +#~ msgid "Because these will be on PDF-schedules, please use the building's abbreviation instead of its full name" +#~ msgstr "Aangezien deze op PDF-roosters komen, is het verstandig de afkorting van een gebouw te gebruiken ivm de ruimte" #~ msgid "Number of lines of code (CLOC)" #~ msgstr "Aantal regels code (CLOC):" @@ -16809,8 +13270,7 @@ msgstr "Foto's toevoegen" #~ msgstr "Alles selecteren" #~ msgid "If all data is correct, we can add classes." -#~ msgstr "" -#~ "Als alle gegevens goed zijn ingevuld, kunnen we colleges gaan invullen." +#~ msgstr "Als alle gegevens goed zijn ingevuld, kunnen we colleges gaan invullen." #~ msgid "Writers" #~ msgstr "Auteurs" @@ -16911,12 +13371,8 @@ msgstr "Foto's toevoegen" #~ msgid "Enter a list of values. " #~ msgstr "Enter a list of values." -#~ msgid "" -#~ "An internal error occurred on the site. Therefore we cannot show the page " -#~ "you requested." -#~ msgstr "" -#~ "Er is een fout opgetreden in de site. Hierdoor kunnen we de pagina die je " -#~ "probeert te bereiken niet tonen." +#~ msgid "An internal error occurred on the site. Therefore we cannot show the page you requested." +#~ msgstr "Er is een fout opgetreden in de site. Hierdoor kunnen we de pagina die je probeert te bereiken niet tonen." #~ msgid "An internal error occurred..." #~ msgstr "Er is een interne fout opgetreden..." @@ -16940,9 +13396,7 @@ msgstr "Foto's toevoegen" #~ msgstr "Er zijn nooit klachten ingediend over dit vak" #~ msgid "Unknown teachers found. Please fill in their data" -#~ msgstr "" -#~ "Er zijn onbekende docenten, vul de gegevens aan, dan worden ze voor een " -#~ "volgende keer onthouden" +#~ msgstr "Er zijn onbekende docenten, vul de gegevens aan, dan worden ze voor een volgende keer onthouden" #~ msgid "There are unknown teachers, see below." #~ msgstr "Er zijn ook onbekende docenten, zie hieronder." @@ -16999,45 +13453,25 @@ msgstr "Foto's toevoegen" #~ msgstr "Het is nog onbekend vanaf wanneer je je boeken kunt kopen" #~ msgid "It is unknown when booksales will start for %(jaardeel)s" -#~ msgstr "" -#~ "Het is nog onbekend vanaf wanneer je je boeken kunt kopen voor " -#~ "%(jaardeel)s" +#~ msgstr "Het is nog onbekend vanaf wanneer je je boeken kunt kopen voor %(jaardeel)s" #~ msgid "It is unknown when you can enroll for your exams" -#~ msgstr "" -#~ "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor tentamens" +#~ msgstr "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor tentamens" #~ msgid "It is unknown when you can enroll for examns in %(jaardeel)s" -#~ msgstr "" -#~ "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor tentamens " -#~ "in %(jaardeel)s" +#~ msgstr "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor tentamens in %(jaardeel)s" #~ msgid "It is unknown when you can enroll for courses." -#~ msgstr "" -#~ "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor vakken" +#~ msgstr "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor vakken" #~ msgid "It is unknown when you can enroll for courses in %(jaardeel)s" -#~ msgstr "" -#~ "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor vakken in " -#~ "%(jaardeel)s" +#~ msgstr "Het is nog onbekend vanaf wanneer je je kunt inschrijven voor vakken in %(jaardeel)s" -#~ msgid "" -#~ "Below you will find the coming activities and activities that took place " -#~ "in the last few days " -#~ msgstr "" -#~ "Hier vind je de activiteiten van de komende tijd en de activiteiten die " -#~ "recent zijn geweest" +#~ msgid "Below you will find the coming activities and activities that took place in the last few days " +#~ msgstr "Hier vind je de activiteiten van de komende tijd en de activiteiten die recent zijn geweest" -#~ msgid "" -#~ "Below are the tutorials of this course. You can change the name of the " -#~ "course or change the working group if needed. There are three fields " -#~ "below where you can add new working groups. You don't have to add them " -#~ "all at once, you can also at only one working group." -#~ msgstr "" -#~ "Hieronder staan de huidige werkgroepen van dit vak. Je kunt de naam " -#~ "wijzigen of de werkgroep verwijderen mocht dit nodig zijn. Ook staan er " -#~ "drie velden onder waar je nieuwe werkgroepen kunt toevoegen. Je hoeft ze " -#~ "niet allemaal tegelijk in te vullen, je kunt ook 1 werkgroep toevoegen." +#~ msgid "Below are the tutorials of this course. You can change the name of the course or change the working group if needed. There are three fields below where you can add new working groups. You don't have to add them all at once, you can also at only one working group." +#~ msgstr "Hieronder staan de huidige werkgroepen van dit vak. Je kunt de naam wijzigen of de werkgroep verwijderen mocht dit nodig zijn. Ook staan er drie velden onder waar je nieuwe werkgroepen kunt toevoegen. Je hoeft ze niet allemaal tegelijk in te vullen, je kunt ook 1 werkgroep toevoegen." #~ msgid "For this, you have to" #~ msgstr "Hiervoor moet je" @@ -17117,29 +13551,17 @@ msgstr "Foto's toevoegen" #~ msgid "Upcoming educational activities" #~ msgstr "Komende onderwijsactiviteiten" -#~ msgid "" -#~ "WARNING: If you vote for a teacher who's class you have not taken, your " -#~ "vote will not count!" -#~ msgstr "" -#~ "LET OP: Als je stemt op een docent van wie je geen les gehad hebt, telt " -#~ "je stem niet mee!" +#~ msgid "WARNING: If you vote for a teacher who's class you have not taken, your vote will not count!" +#~ msgstr "LET OP: Als je stemt op een docent van wie je geen les gehad hebt, telt je stem niet mee!" -#~ msgid "" -#~ "Beware of the fact that you delete working groups if the lectures will " -#~ "not be given or the working group will removed completely." -#~ msgstr "" -#~ "Let erop dat je werkgroepen alleen verwijdert als de colleges echt niet " -#~ "meer gegeven worden en de werkgroep compleet opgeheven wordt!" +#~ msgid "Beware of the fact that you delete working groups if the lectures will not be given or the working group will removed completely." +#~ msgstr "Let erop dat je werkgroepen alleen verwijdert als de colleges echt niet meer gegeven worden en de werkgroep compleet opgeheven wordt!" #~ msgid "Warning: documents will be automatically deleted after 48 hours." #~ msgstr "Let op: documenten worden na 48 uur automatisch verwijderd." -#~ msgid "" -#~ "Warning: the people below have signed an authorisation form, but have not " -#~ "registered a bankaccount number!" -#~ msgstr "" -#~ "Let op: onderstaande personen hebben wel een machtiging, maar geen " -#~ "rekeningnummer opgegeven!" +#~ msgid "Warning: the people below have signed an authorisation form, but have not registered a bankaccount number!" +#~ msgstr "Let op: onderstaande personen hebben wel een machtiging, maar geen rekeningnummer opgegeven!" #~ msgid "Membership terminated prematurely" #~ msgstr "Lidmaatschap voortijdig beëindigd" @@ -17150,12 +13572,8 @@ msgstr "Foto's toevoegen" #~ msgid "Create new memberships" #~ msgstr "Maak lidmaatschappen aan" -#~ msgid "" -#~ "Create a class for every group, above they have been separated with " -#~ "comma's and are in the following order:" -#~ msgstr "" -#~ "Maak voor elke werkgroep een college aan, de locaties hierboven heb ik " -#~ "gescheiden met komma's en staan in de volgorde:" +#~ msgid "Create a class for every group, above they have been separated with comma's and are in the following order:" +#~ msgstr "Maak voor elke werkgroep een college aan, de locaties hierboven heb ik gescheiden met komma's en staan in de volgorde:" #~ msgid "Master studies" #~ msgstr "Masterstudies" @@ -17343,9 +13761,6 @@ msgstr "Foto's toevoegen" #~ msgid "You are already enrolled for this activity" #~ msgstr "Voor deze acitiviteit ben je al ingeschreven" -#~ msgid "You cannot enroll for this activity" -#~ msgstr "Voor deze activiteit kun je je niet inschrijven." - #~ msgid "Foreknowledge" #~ msgstr "Voorkennis" From 4070ecfbb51432fc0a55d8f1b5ae8546004a869a Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 11 Dec 2023 21:08:14 +0100 Subject: [PATCH 10/29] Add about pages to the GraphQL API --- amelie/about/graphql.py | 43 ++++++++++++++++++++++++++++++++++++++ amelie/settings/generic.py | 1 + 2 files changed, 44 insertions(+) create mode 100644 amelie/about/graphql.py diff --git a/amelie/about/graphql.py b/amelie/about/graphql.py new file mode 100644 index 0000000..ad3d313 --- /dev/null +++ b/amelie/about/graphql.py @@ -0,0 +1,43 @@ +from django.db.models import Q +from django.utils.translation import gettext_lazy as _ +import graphene +from graphene_django import DjangoObjectType + +from amelie.about.models import Page +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + + +class PageType(DjangoObjectType): + class Meta: + model = Page + description = "Type definition for a single Page" + fields = ["name_nl", "name_en", "slug_nl", "slug_en", "educational", "content_nl", "content_en", "last_modified"] + + name = graphene.String(description=_("Page name")) + slug = graphene.String(description=_("Page slug")) + content = graphene.String(description=_("Page content")) + + def resolve_name(obj: Page, info): + return obj.name + + def resolve_slug(obj: Page, info): + return obj.slug + + def resolve_content(obj: Page, info): + return obj.content + + +class AboutQuery(graphene.ObjectType): + page = graphene.Field(PageType, id=graphene.ID(), slug=graphene.String()) + + def resolve_page(self, info, id=None, slug=None): + if id is not None: + return Page.objects.get(pk=id) + if slug is not None: + return Page.objects.get(Q(slug_en=slug) | Q(slug_nl=slug)) + return None + + +# Exports +GRAPHQL_QUERIES = [AboutQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index acada6c..0fe55c9 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -401,6 +401,7 @@ } GRAPHQL_SCHEMAS = [ + "amelie.about.graphql", "amelie.activities.graphql", "amelie.education.graphql", "amelie.files.graphql", From 5f12f07eef81dc847231ecbafccd44dcef665a1f Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 11 Dec 2023 21:12:24 +0100 Subject: [PATCH 11/29] Add translations --- locale/nl/LC_MESSAGES/django.mo | Bin 265896 -> 266022 bytes locale/nl/LC_MESSAGES/django.po | 32 +++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/locale/nl/LC_MESSAGES/django.mo b/locale/nl/LC_MESSAGES/django.mo index 6a110441ffd71e20817d099534c8f47cd6b72914..7e8df25af8313210b2178d59b93544f6e586b968 100644 GIT binary patch delta 41753 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\n" "Language: en\n" "MIME-Version: 1.0\n" @@ -12,6 +12,21 @@ msgstr "" "Used command: ./manage.py makemessages -e py,html,txt,mail\n" "X-Translated-Using: django-rosetta 0.9.9\n" +#: amelie/about/graphql.py:16 +#| msgid "Person name" +msgid "Page name" +msgstr "Naam van de pagina" + +#: amelie/about/graphql.py:17 +#| msgid "Pages" +msgid "Page slug" +msgstr "Pagina slug" + +#: amelie/about/graphql.py:18 +#| msgid "Save comment" +msgid "Page content" +msgstr "Pagina inhoud" + #: amelie/about/models.py:9 amelie/activities/models.py:26 amelie/activities/models.py:464 amelie/activities/templates/activity_enrollment_overview.html:62 amelie/activities/templates/activity_enrollment_overview.html:180 amelie/activities/templates/activity_enrollment_print.html:29 amelie/claudia/templates/claudia/aliasgroup_list.html:21 amelie/claudia/templates/claudia/contact_list.html:20 amelie/claudia/templates/claudia/email_detail.html:16 amelie/claudia/templates/claudia/extragroup_list.html:21 amelie/claudia/templates/claudia/extraperson_list.html:20 amelie/claudia/templates/claudia/mapping_detail.html:18 amelie/claudia/templates/claudia/mapping_detail.html:84 amelie/claudia/templates/claudia/mapping_detail.html:139 amelie/claudia/templates/claudia/mapping_timeline.html:21 amelie/claudia/templates/claudia/shareddrive_list.html:21 amelie/claudia/templates/claudia/timeline_list.html:20 amelie/education/models.py:25 amelie/education/models.py:47 amelie/education/models.py:132 amelie/education/models.py:178 amelie/members/models.py:36 amelie/members/models.py:57 amelie/members/models.py:81 amelie/members/models.py:121 amelie/members/models.py:218 amelie/members/models.py:248 amelie/members/models.py:660 amelie/members/models.py:690 amelie/members/models.py:874 amelie/members/models.py:897 amelie/members/templates/committee_members.html:7 amelie/members/templates/includes/registration/personal_details.html:14 amelie/members/templates/includes/registration/personal_details_employee.html:14 amelie/members/templates/registration_check.html:34 amelie/personal_tab/models.py:253 amelie/personal_tab/models.py:281 amelie/personal_tab/models.py:319 amelie/personal_tab/statistics.py:266 amelie/personal_tab/templates/exports/screen.html:67 amelie/room_duty/models.py:17 amelie/tools/pdf.py:98 msgid "Name" msgstr "Naam" @@ -1588,11 +1603,6 @@ msgid "Photo archive" msgstr "Foto-archief" #: amelie/activities/templates/gallery_overview.html:245 -#| msgid "" -#| "\n" -#| " The photo archive with photos from 2000 till march 2009 can be found on\n" -#| " foto.inter-actief.net.\n" -#| " " msgid "" "\n" " The photo archive with photos from 2000 till march 2009 can be found on\n" @@ -10053,19 +10063,19 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" -#: amelie/settings/generic.py:701 +#: amelie/settings/generic.py:702 msgid "Access to your name, date of birth, student number, mandate status and committee status." msgstr "Toegang tot je naam, geboortedatum, studentnummer, machtiging- en commissiestatus" -#: amelie/settings/generic.py:702 +#: amelie/settings/generic.py:703 msgid "Access to enrollments for activities and (un)enrolling you for activities." msgstr "Toegang tot inschrijvingen voor activiteiten en het in- en uitschrijven voor activiteiten" -#: amelie/settings/generic.py:703 +#: amelie/settings/generic.py:704 msgid "Access to transactions, direct debit transactions, mandates and RFID-cards." msgstr "Toegang tot transacties, incasso's, machtigingen en RFID-kaarten" -#: amelie/settings/generic.py:704 +#: amelie/settings/generic.py:705 msgid "Access to complaints and sending or supporting complaints in your name." msgstr "Toegang tot onderwijsklachten en het indienen of steunen van onderwijsklachten" From 09134c8bbd836ad577b6de8074d3fa17384bd73e Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 11 Dec 2023 21:49:05 +0100 Subject: [PATCH 12/29] Add the company module to the GraphQL API --- amelie/companies/graphql.py | 102 ++++++++++++++++++++++++++++++++++++ amelie/settings/generic.py | 1 + 2 files changed, 103 insertions(+) create mode 100644 amelie/companies/graphql.py diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py new file mode 100644 index 0000000..99e47e7 --- /dev/null +++ b/amelie/companies/graphql.py @@ -0,0 +1,102 @@ +from django.utils.translation import gettext_lazy as _ +import graphene +from graphene_django import DjangoObjectType + +from amelie.companies.models import Company, WebsiteBanner, TelevisionBanner, VivatBanner +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + + +# Note: Company events are implemented in the calendar module (amelie/calendar/graphql.py) + +class CompanyType(DjangoObjectType): + class Meta: + model = Company + description = "Type definition of a single Company" + filter_fields = { + "name_nl": ("icontains", "iexact"), + "name_en": ("icontains", "iexact"), + } + fields = ["name_nl", "name_en", "slug", "url", "logo", "logo_width", "logo_height", "profile_nl", "profile_en", + "short_description_nl", "short_description_en", "start_date", "end_date", "show_in_app", "app_logo", + "app_logo_height", "app_logo_width"] + + name = graphene.String(description=_("Name of the company")) + profile = graphene.String(description=_("Profile of the company")) + short_description = graphene.String(description=_("Short description of the company")) + + +class WebsiteBannerType(DjangoObjectType): + class Meta: + model = WebsiteBanner + description = "Type definition of a single Website Banner" + filter_fields = { + "name": ("icontains", "iexact"), + } + fields = ["picture", "name", "slug", "start_date", "end_date", "active", "url"] + + +class TelevisionBannerType(DjangoObjectType): + class Meta: + model = TelevisionBanner + description = "Type definition of a single Television Banner" + filter_fields = { + "name": ("icontains", "iexact"), + } + fields = ["picture", "name", "slug", "start_date", "end_date", "active"] + + +class VivatBannerType(DjangoObjectType): + class Meta: + model = VivatBanner + description = "Type definition of a single Vivat Banner" + filter_fields = { + "name": ("icontains", "iexact"), + } + fields = ["picture", "name", "slug", "start_date", "end_date", "active", "url"] + + +class CompaniesQuery(graphene.ObjectType): + company = graphene.Field(CompanyType, id=graphene.ID(), slug=graphene.String()) + companies = DjangoPaginationConnectionField(CompanyType) + + website_banner = graphene.Field(WebsiteBannerType, id=graphene.ID(), slug=graphene.String()) + website_banners = DjangoPaginationConnectionField(WebsiteBannerType) + + television_banner = graphene.Field(TelevisionBannerType, id=graphene.ID(), slug=graphene.String()) + television_banners = DjangoPaginationConnectionField(TelevisionBannerType) + + vivat_banner = graphene.Field(VivatBannerType, id=graphene.ID(), slug=graphene.String()) + vivat_banners = DjangoPaginationConnectionField(VivatBannerType) + + def resolve_company(self, info, id=None, slug=None): + if id is not None: + return Company.objects.get(pk=id) + if slug is not None: + return Company.objects.get(slug=slug) + return None + + def resolve_website_banner(self, info, id=None, slug=None): + if id is not None: + return WebsiteBanner.objects.get(pk=id) + if slug is not None: + return WebsiteBanner.objects.get(slug=slug) + return None + + def resolve_television_banner(self, info, id=None, slug=None): + if id is not None: + return TelevisionBanner.objects.get(pk=id) + if slug is not None: + return TelevisionBanner.objects.get(slug=slug) + return None + + def resolve_vivat_banner(self, info, id=None, slug=None): + if id is not None: + return VivatBanner.objects.get(pk=id) + if slug is not None: + return VivatBanner.objects.get(slug=slug) + return None + + +# Exports +GRAPHQL_QUERIES = [CompaniesQuery] +GRAPHQL_MUTATIONS = [] diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index acada6c..3d1c81c 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -402,6 +402,7 @@ GRAPHQL_SCHEMAS = [ "amelie.activities.graphql", + "amelie.companies.graphql", "amelie.education.graphql", "amelie.files.graphql", "amelie.members.graphql", From 9ae9d6146635201bf70f31ca8b051dc8696e489d Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 11 Dec 2023 22:04:28 +0100 Subject: [PATCH 13/29] Fix identation --- amelie/companies/graphql.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py index 99e47e7..e98d9a5 100644 --- a/amelie/companies/graphql.py +++ b/amelie/companies/graphql.py @@ -76,18 +76,18 @@ def resolve_company(self, info, id=None, slug=None): return None def resolve_website_banner(self, info, id=None, slug=None): - if id is not None: - return WebsiteBanner.objects.get(pk=id) - if slug is not None: - return WebsiteBanner.objects.get(slug=slug) - return None + if id is not None: + return WebsiteBanner.objects.get(pk=id) + if slug is not None: + return WebsiteBanner.objects.get(slug=slug) + return None def resolve_television_banner(self, info, id=None, slug=None): - if id is not None: - return TelevisionBanner.objects.get(pk=id) - if slug is not None: - return TelevisionBanner.objects.get(slug=slug) - return None + if id is not None: + return TelevisionBanner.objects.get(pk=id) + if slug is not None: + return TelevisionBanner.objects.get(slug=slug) + return None def resolve_vivat_banner(self, info, id=None, slug=None): if id is not None: From 5ebfc39bdcecdd1d3bac782bbca32f5effd90edf Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 11 Dec 2023 22:09:47 +0100 Subject: [PATCH 14/29] Add translations --- locale/nl/LC_MESSAGES/django.mo | Bin 265896 -> 266100 bytes locale/nl/LC_MESSAGES/django.po | 32 +++++++++++++++++++++----------- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/locale/nl/LC_MESSAGES/django.mo b/locale/nl/LC_MESSAGES/django.mo index 6a110441ffd71e20817d099534c8f47cd6b72914..356d712d3694119d852e4e9d3ce98a8b45ec0115 100644 GIT binary patch delta 41782 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 Q%QMmK>n&IA#opZd3oo6rlmGw# delta 41708 zcmYJ+2iT9*|G@G4c^;$e%#`uid+$;9-WgeuosyA48sCyaBt@E{jF1viNc|$a2t|rS zg_0E&rSX5izvsTL|Nr`5*Xx{noco;5`J8j#&qIE{y_#$3yj+Q+xidT$@qgE4iK0Td zsI#>ws`%Rf+m>P_>N)}Ur$o^w_#XAS3!|tF^$v@oXcYD57l(E-FNvbE)Jx(E*a5G{ zlNfRRfB1b$l!&6GQ8a{OKP-!))|_awJk+0kGm83Bzk;6c{#F$IiXY&e_}1Iu`1LEJ zXaMzx@o7AU58~)|qNod=#ZR!&swmopX{)2?2=2iWDLntpHBt0TY7~9`ZWImWfdk&B zGhDD^T@-zTE7nJLGn%p?iY{X2529!u*ZqY)=!FlXXb|T6D0Jw497X**d=xwVkEq~2 z?1{raj-sx(8N1tX{!N4xN8mI(fd_EZ<|z6UThRTPc-@xpfCcD?GHs2bzi}51!|mI` zh^uUmq8Zd5#hVydjvY}n2ir4z2X_3kaR1ib49te6?TMm4u*2sel+E`>(O1-$VExR5 zb{}~`ef^;*YLXH~{l1Q(JE$)pJe}~`!<@rjcmwD25Z~6+D}T#qaXd1s(Q&NJ`58x} z=zi*-d`DofP`K$>6fNdN?c-52lKPSFqo^^qqq_rf2Hu9}k^hf6{1`%6?L-un=DsJ9 z>5NvL3=bT9isa+?9&})re~P02Q9t){6g9-Rf1y46 zu{ZvTBd~qq&nRk1VLkT5=&xWe96)t7-i>*$M$xS}3Gcygunl$~0c`krB;TTw_!2Ju zCyEAR<9|bvF2>r_i~q;8U@xqKiK!HtQdozL@hXnQhAh%@_$F?|1NbmLo05{e@w(KM zqshbMboIf_CUzY=-F> zQ=;-X7;nI*u?Q|luiqKhzehWgk|}hcJeH!~3Jc@im=CApFnkTmyRfg#oD${XKus)w ztuZ^^jyZ88+QEm>(5=AycsM?O5$#wyiBJL?U^VQIcIX+*jT>TjV^!+MuprNmuDdo| zPyw%@elupmR+tMr#`XT_gNMfThj0q@$!KV^WeNA+h!d!n#A|ULw#GNmNM69jcw<)f zUoY51!5)2z4e)O?d+TNk-h+LpufSS(P4*P>gO1`u_yC&3f1)|lI7doU2Jb}Mc^2*X zXK0T6fYq^hPWE4tAnKko%=t=WwM7>(GyaZ7;vaPGGUN(Vbwg}r%*OGi=mR^U5gd=+ z_XrllDOePjp}DgY&556KCBg-nt_wXci=Maz4b^C@fG=Y!+>UKAXYP>2z0qa61l`&G z!zx%iZ%TBM<3sbYN*Gax{2{kiUmvDw7n&1aCnz|AGqHc7Jr2;_Gec`5j5Eo%_*4WebJDQKtp&hX2FNh3#Xzz zUVuJu4H~KKm={l=q5dnj(2b#;o6+;F&{fqJecqke!u3CqLK+7?MzeTJ>=)<=zehKe zOK1bR3WbOiK^tm@MzAYp#oN*AM#S}ras3H&Ky%Oz&BxrX|92@EvhC=GvJZ{GX|%yh z=#Bry^(=)$NAsiSOQGkhp&f3B*I@^=gZW^Wrz$5Cj~%|bh{8Xft59EhjT$hIvO1~3o{QXh^E__1P%(D2jo z1<#|QeHCqZH5!30(GDDs>p!EB`U71BDaFJ2qIe(mGU&@|9y*ZYSR#d7!lu*Gsz8O5s5sWcCfFCf|5bFWU5>7j zRcP*fj7DrXIu&1`t0sFzBE<8f!WOU?R>x9U6?>w~W*WMeuSeenhtLT9gWi`~DLg0> z+Hf8;iA$i@)j=cNFt$_dKuowH+(*HXO-GY!Hrl{z=m^%L%Vslr-4V3mAJI_$jJER| zdS8~xyysJR$zWgVxA97J-ETmz|2X#3Dy;ub95~23jY2U774Y>juJk$4wva5I|K zpW}mg8oS`I>LF*=qxXM`hI$XWs*a-r`44R;OO22t1<-*NNl>r@Wzh#VL_^y)KHdr4 zNCsgYd;qNxya|oKA#8|=qZG`_8*7D7bwNWs z5FPOt^g%Pw5iLcNaa(-+1Ui5eK7UGMJ~Rm%qV2Sg?Gqor6OGVBBqE9EDGK)dC9I5V z&=Gu(CfiwDj=$qOxS&or-=%H{WnV18@jLt;RcS5JIckDRy z`e!lWgI}TGTrEO#VGTM*Kcg4^jTJG|O=0V;fsSkddfk)g`k#kBa1DCjM`)yW#PtJc zN4|@_dK2s45Efv!@WQfaGSxy~Ms3iL_d`c?KRWV7=%>_1^t!Ln4eA`4OV>0C$BUuY z*G8}Jh^~ga(1Fivln4)=%K<~XFg~#Y?a;gN@lEL7zY87d8Fb@HZ5$qa3)ZDR0v*6& z^t$!v6n>5l;3S%?*EI=|tCgVOdTfoiVMpwVE3gA*Y?_k%?N?WHYSyC>+8{oZ;eeHj8B|GLvjfn!BsT$Ih%)`mPgn1P3RX*2Q+8; zqf;;v&4tI%kk3Vv_-!--yW{geqEmGlX+IHN*CO0l5k1ieZJ-z0kum5<9!ERy4Emtg zFgZnN(rrRV`WYI5Z_tq*kB?uB>ruaiE4U3m=olKF)G18KQ)t#NKnL(1I)JU{>iPo)b45W>=EsGFiWa~n>0Q9~m(6`+(wBgUuhEJg# z$=E#{FN7|~nrM4n(Iig{p_!zx$A3C=`#OE)@$5VTRWXp>t zWkLKKOP~==zcobcCNwE~B9Ti(w^8tcL*f%7(d9H2({W0Cd?`AIZ=oIf0PWysXk?C{ zA9~y~q@%i~^dn;o%qLJQ-4q!hfOo|^Vm`rK6g@#L`A+8 z=qec(AAb}b(X;4kcqKmmJ{rj#Xa~PSbL$*BwQ2oA`vv;3{_ROw4mdaU(K&96j<6%z z<9=u)hQ;S6$LF6#?|U8X@KSV2)}vFgAMNl#w4LK(2?=!SC)+hOAYVVTcBr)oaB112_5Fl0y2 zk^GJ(U*>_~hGJNmdQG%rgU}I;!j3or&7tjRgifM!eg=~p*`V;i>(LI@Ks(qan21JF zuqV^8DZYj2cmdrJuNxd1u7q~12AV`2Vh5n1zYk5i1R9~4Xop`!L%ta8*oyf0CwRT< z|8ok4@~8NM-_beFHYChparAuo*g9xVG)J%NhCb*{v}5DYh(3uvcp)0u<*^&lj_$$2 zJU{xDf^&Qo-HP)J4Gok=>y6L|-Gb%uUNp4x(T3hdbLA5>srJS7U(t^J7n^lhn7RUJ zN7FH3&uUVzp_b?rbVo<{LhRD`{5teO+hY%)_y2%C=y$vcQ|<^;&^l=FQT-H>gaa<4FYgLHKY@nw0uIGoBf?0>V-4!l(B%9O?fBRD4Iahh z26T5y)SUW$Y>x#-h7Jrym)~f77^f#F)TfYTRQT;w3v5gMajcDdaR6o>9XdE1oq~z6 zQ_%>_MI-cTeEcmmQXgP)LqbQq6P=RJeTm`+a7P`zDqDkEqP2#)IW%)1~>1jyE6VXc)e9-IY4R6P8LqEBWqREnaPp|-* z8x_$88>9EPLzn5TXz~umQg|AfAgA6&+x_j{5Rt#p4&=En{H%Dry8gRRu;C}sP`->+@HI@X zXLK%q#n9L@G-2lt>4%rrMNlpBjtFM%dg3p8gYqpM&pnykyv zWL}Lf$8~ru?!e>#kmZ_)j#4mbe!=qiANqju&xhn`j~*Y0M&K#*{4#XE_!RRHi67$g zmtP3`M4lJJR$CT}b6qn`$DvpWr(h1(|5^%esasS>}iRp$Ga7=!4a9AXdTWuoG^@YM5_9xW3f_*1tPfdk*-Zq3B%Si{3aN z?a1foy1#-ZRq@wChs&ZPs)inKjTx{bI`Xb)(hWifb~hHmM11_!*An4py`>y*$2x$H z;CHmaztPa8z8)Tw2W_xCx--^9?`w#Lv@aUT(O3!ZM<4tK+U|NRi66)H6A21N;0*fV zkZEB^mZInb8lVj~LnCu5x_l;~Bb^!7XQRnAAC1TgbnpKJ?eHn=fxpJbTQ3SfAtgpo z@Ij-|1}30AejLsE=i~YkbY$z$>o>*qow57TBt49F;1b$Smc`+%SO|@18FWCEkoFQ$ z6AEq|ZP5qbhAx*8@$so>=w6O}9gV=U*tO{Wo6rY-iH`UrI-m>j@qf^c=Uft|v;Y=# z{g z&<@l@BiRT2q#L!I^`A~*G6xLJVl-qQ;66Nv&gIfKL&K}F1@#TsAEOoFH>bB_4XX3d zso95Vcm!P~$IyYCK->E*uK&A&_3!%5{#FQO5%j{=I2domnz#{-$gk-28Qu;f&xby! z7`l8*p%1tjD`IOj!uMfv*`ghsiMI1%f`W6k9KCQ2nuH&tbAKKU?SJTcF1#{4ph;{y zG`YH?BYhmrp(kTsK-*ms*VmxeZNlVExQ&9LKY;`AD*8=#+dEfd9b1Kt zbQ3zFPtlGXL^rfdtHS4ZI{KiNSO$lnk$4J8)9jbZVxf19}-<@2fB!_n{rUi00C@@3H=yQ>aA25Z{B& z>5FJc7vgB#fhJA8_d^G6Mz3#=Mqn)3;mOz!UqMHH6-~ZO>wgNAe`y5*ilbLc;G`R4r~tb*$3 z)O1154@<-c9z-{uXVK8ThK_s%df^sqhF{}EEW9y<@&znMeJPp?`|%ha#&>YzhoPf) ze-yqSrlQMn4K~HZehQr_)fr3fc3r)KI=p2ql8=4gRG@1jipdDNu*Vm&R z+>Ul&FWS)`(ET%tL&xsHL?sS9NWq4dqdi}R9{&vO>0fv=X4)3A zw*?xhKInr-#Px}2*7_?W}(vP@4lzK~uEe8f~~6+Q7iL zJ__yVL+D5*qmf#LF01uuQhpxS&!f4OaYtA^xv(AeZdel+>_~*2?f?hMbKoy*fTebZ z_x}KFPJJ7;$E>@;^6QBYQ2zoOVy90-a?L=K^G%$BJJ7lB{8^ad?r5$IL6472P$)}b zEIRU6up}i>1p0uvXpSsGuU{LV{{Wr3Pmy-{ z?>{J*)mc6dBPonFR1sZ14dZ%Cw1Yij`=JjQiiUJN8p%hnEiOYl{#$%L)83FfInn#_ zCuRMWq2P$?q7Q5l+X>C$URVJ~#`Txt^DEH@tVaj%X?*->>`$>5WB*1wnrUBnPEK|G z7o=baOJF;!9M>meE9#G$0x70Fp`D{m%=oC8VDPM#K6o{>icDO}c?~F!ZSbTgUI#rLO9exUpBAeyAp(a^t)zU@|H6WoO^ z<7@}R0IFd!w_-b?5$u(q;6^YQ-Fk<|^~vZ|OhY5H44uoh=mj`(Qo&&a?N(Qgz?wm;F(=J_T(xHuZp2IvU8q9Y!T_IxZF zi7DvR%!%EJPR+mQT<16(rYIeaWF534%`lhm|Be*Ap+6epQRtLBgm!2WnncgU=U+l| zV=0!wchDR-gm&mWdf(q@WV0R#?G}lxh<2<#R^$0mdkRM2VXT5LU^?zVNB%P!^8c_r z7Wy_c*a{m{?~cyxTujG#=yf0ASo|3$<84Pnz)jAC_a4?^*x$7oJ2zzYtgA3cL^d{v0B)AMNnh z=ss~4y*}6JU_qq)L{yxDA+C%*pe{O+##j_Ppi^=;+Q0-f)Q@5sPQ_L@1MTRSXglAd z_nnUGzoR+x4;tB=zt|q@uQ&zgq5|5Hs_5IQJ~}0xFjETOY?u{CoC$weHQ{U+*=lqu z4xkS#axNrmIW+6rqFMh?e0&)?z+ITn_5W3T;w(BhInIYaTdi(xCTg+{CwCVb#)6x!ggXu}OIh2`@I+Q3?D zi5Y$if1ke{I@e3l(&|`-`d#RVW}_Y7jc(CrusmM-Pv~Gxv_1^I z?pbsItI&Pns|1A_6fUAYEd6gtsvhX_xgWjpDKs)G&<-3zUpmo$p`!)R2vtRMqFY>l zJa!q{;oWF*XXclD=18Itg>(wlu^M*87Wg=p!%xu&{Ep^Eft1wbgZiR5^9Yv3UFb+J zVM#2Kni?XD6R3|tSIKEK=W3*-`rm*jqQ@wV;J`moaAlU%$AR-{U>7EA?IIswt8yHEN0-&`8Wem+L|F zzEanP5%)WD9I31n3jp&s9hS%Z^`BRfyb;<1rw>sx84mL zaPO{(S+P-UJM@NIu{aJz8=Mw93%&k%^ty#;$5*54dlweO6S4oH%evqVsmXUhr38hd z9H@`Jm3pIZvAfX@J%C2$3Cw^`qc4v+m=j+^BeM$A@O^Z@_yBX^H)sTZK_4957$Te( zucw+QLct!^!HU=gJK)1u3_rtecn^b$J473j#;qjUa0bOf8@^9SSl4_J=lm(d3oD-x!t0h-)R z(FgWNBQYM0%nVHa{r`Cs4CR~Xmihtu;Qi>79731RFX$AMD;gqG8I3?^bc*_*BOQ!x z#naG%y@lq;`)KZbg0{a4Z*cwZjZgf7hWaAf<5uY*68+K0j6g&EaD4oU*x6_Y7NFNH zi;sVRc6bLSUsC9U&!CaHhzUcQvsh~KpH3-(cTiu0W_zLHAsHKCDe4{24va+~_y9WR zlhFvy#__liU&9+qgbsX&Mqo3#lkUOC@!t}xe;b-yGFDjL%?g{22XixQu?#lrNn~P5z`argUoZ^|%r3z#rHe z^OXs2w|?k@r(h#of$nf;;^T$OhOM?Kx(vsmNjwn^^%OKY7hzX6s*ms=>bVo;Lnv}p z2z&NiyqOc9qa(>tF*W%Y1@odKoQ+P!3s?p}LLYb%4e@C-`TjtstjFHuiCp`Eje3<&(crBqmgTtu*Q8zUji2dq?oY;gdeE(md;0S8h4|CNAO}Yu_ zNM1mbX9qgx|6vWR+8|8TU^L_lu_tav&!;yGUqIc^4o<@1_%1fZA~&T*jd?!*8D01y zc^w;4{{+ipbaSu*x>xr=8ybaf)vsYk+=DH!aHEjCgU~H}5+>jGxSD#_#;MUV{0JYz zJDRZmpQmt!!Va9=G&TJ5I?cidLbc}MBk?|T-A_li&e`bBw+MY%twcxsA-W&@ie`J% zA`IXL{K6`>!h$VB@(pOo`Zp`*a=`WdKOBqSV{`1$D(v|$V}I%^@pjDFIyL#X-bUjR z>UXpWTXfF0snMgb95P=L$~6qSOGJ(OHKZ}Bh}g^Qj@$W5Iram4G^?q~;GIb93U5AFgDrUk)==qj$y$fDLy=UwIOrxH-GrnLX z8lwBqmq-F_;F;Ymx#(! zFuUu-Cpx1y4nreyH`?$F^!+^-eJ#IH#R~?+y;Hg+>Uv0G&+@&(LH}2`u1Co zrSKr8aqnC(#H0f{x_(xSpX$7-+_-QltRy!N2k0hCf9#W3XM6?0xRMZSQgiy5jcY7F>mki;6~_j?Tkij2zE>1 z&xEi8^?iN9%cyAI@HV{-U*dR^+t}*4?g-va{ks0~_y0WWA@FoG>gkdJ+rVks7VV*O6c2Mm>k~cEqN4r6&JrhI>bZPp+bOhmpUE zTe$uR7Ua6uMuuNpd@w3}JLVi6-ny+vv;M1a;babU!FTZ?%rqu^qfJIbzXqL}qj(!; zy(j!`XE?r1{Qxe&$zxNKf4jZZz2U9;JWl2KXSe~o-xoe?a*Ye^bsLumpU01KfL~xo z-y*+zjJ8b(zr*=xBEO^I#=Z}vM$_@y2UDZX_#FBk@A**pNoOY3A-k$RoSOXm{dYW; zn*8s9zCd&0?aAQ-=Wo1+deO&;BtDylvpD3+ol-KT`eJTNsi`LAE@ z#y%YX-?Z?#e&h6T|6r`meN)iyiH~prUW$*;nL+k*-=}yl$M-!Io|kAjlbwwdkK=os znEEuohNIqSR%&#P`m|?QM${)fOOD{w*&)R5&Iwaf`nlBPzwy!q>!dPL9L;?vpAVn) zx4sZQ(e~qBj^F=cYVywu+P;*0naDEP9-`*Qf)u8JS+N3H<8$k)TvoW*X`b1e+@A$Sw@saVMO|27I8 z@dq4+)fa`=<4f3y`WiF>X^X@9?S}=ZKZ8bK8MeW*=*CrNN!XZfM_<3=(E-dsBmFj} z<1S48_rJeTD8Yd&Z-gJgDx>e`?&xwHiDvs5%z?$1h8?gPy0^DPx7u##avh9D=xKDP z`~b_~UbG`u(2nL_#`-Tsp~14S9tWT=qnYT93(yZ6@w_p#PgGTI^_;|6m!>SmBZ8`oW`Was|u`(38Vto!wL6dGX+Q1<+>2kai zeqyPMHt;O6+M;hUGaf_VfSIERQ46t@g#Z zzAg4wG$Mso2iv08O~9JC813*kXfo$o6FS@<8&hA8Zt;I%9rls-@ABJm{`@JLyf!s@ znG?Uhml_RWNKd^VlJC;`Fjv_&ge1EW{V*vPTMOB7qbBIcTA{hr1*_qBbU@3{-1riW z%*oiRnEd;HxjqQr^M%k5)<>636D*1S&`>^xCeQO|#Fn5Bej5$tI&{@+#r${_oyyAo-uQB=izta>9(ZA?A&h=3Uc{;j`Dx)3ifHpJ;eb59nBF~`@T!hI; z#K*Uy_kD@Be;R%8-{_8+{eP@~H-xhP3+uaSY;P>g@q5r6YgX(E^u`@n6n{WFlJ;@9 zE*+7n;+6FTAyn?l1S&>lBNN8SYu;n4W_{qgZ9 z(a6n5cf^(G13p9}^aXnV_h`p2qt_QmYz}*I8FZwru?h}Gb7BrU;`!(e8_);rLPvTC zz3vS9z{}{W$o@&#((|AXtb^vlt?1VKAeyX+#T4$Q@DbWz#VuhKG)CvL75dBK6_ui07gWzZTcuLPxX?o$GyQq<)Ie|AF40vLke~GG_Aq-++R9cT=p2lhHkY zE!M+cJHw~dY;**>(BwLYCU3S~Ap)h*Ic|X-?~O+6UbI6Gq8*%#LvRHq|NYp#a9`YhyBC#=T#1e(OFF!}TU z77A`GpJ6dPhz;=y+M!yz!^mz%JJc2JNIx{`Mxi))g~&jB0w8=cc^pNE&q_2}^qn1;8-4!}m#hhS}79D4-K_B?yTT-QJ&bUS+g z5Hu%-qscpdFYDh>PUC<*nupHSqSz1650CwE{WQ9~Quc);%8WLYH?EgP=ePzsh3(M} zbVDE93w_=&bXh-;pm00cJ{L!G;PU?PfIGej9U6&F&3)Jl6F33CM&EX~d>I;^fJX8O zw1czJ$i0YmWEt9lRp=D{FRmwcQE2kCs4qIw zG3XSH$By_kn&n4v80I<@mg@v`SnB#Cb zUL1YfRYM=tF+Tn%8lhQu0AImPc+Zg#(VE|esceL`INlP|@j*=J170cpcG`aS~9z>_`D7r8Fj3(uO=zy|)7c7iUW##W!|BkQ~2OLo! z9D*~^5&eedKy)nZVArA#sE5vdb4%+<4x!d-=ZTug-+3Vtcw4l$ynw45Siv!o_ag1fa9x0hfd`+r-`)dzc2-tVLf!jx1ph%fcA727R8ll2tP+RkdyKGYkvvH z%c7xggeGYxv_t*k`aS3XAB~-f2}klW1#f&E&CbD+g_8jZK6@``@u)&#VhvuMjx*$IOAwEw1 z6P%SoHlJt2yvDw{5F+>M#n6G2OW}9EIdCi2U&L>4-ESe6X8#^K^cvdXHHo!uQd+JBarDbbS1BT+e?cbhHH8a4j@x+oB!46U~_?@F|>$Bzqz% z^k)ct9W?uI!fx0TT|RH24Q@v}a3nr{0ZqCre}#w@LmyB9ZKnpB8y(U62gk?nN0;>+ zO#b`-uTyZuYm*1~@fdC3YcxrIi_LvCBxhB$!PaON--bqNXzYDxdy~-zJr^Heh)(5d zw4+-vx9k5i3jS{PJ4~m3;_nc$O#g(9ra1bba_CE{I-0CEp&e<4ZmB)dpU^4DoFOea=Xud(T^ik(s-gpGlc3;(dZXETC))5M=+-$0jl>)1 z4QtW2*f#V5pT_48p;LAeUH`wL_vg)5~1$P~>KMpPS(L?`tAe(~|)aeWdxz^BmMS%|EHM6{BEp?M$8@=a)x?Lsfy zhbGmxXou1=hpEVmE~napgHj!8i|XTu%{Wa zg^}bzLskYIQBCxGb4y7j$6%pzRmP9*&pH&iZ%G zYIDGzcR-g%&)6|&_CJX>@Iriib?m2TNPk2}mX;%|^Zb}jy)qhsPH4wRp#z&7pP!S1 z^>2^Ya=;F3K^yuU9ntsbjc3r2q~r|e^I&W0rO~7ug`R%|UB1tv?JkL38z0|-CiNk_ z34csbFeJrug%efK2RA@F)B@ePI^$rx1ATey#!+|xP0AM6g&gXG*6%^vor(kTIW!rs zpvyQVcUV=4k`xSiTkM8|(4MbDZ`h75$GzyEUVjyz&z3iwzY)_pUlQ-Y7HHDGjW^>i zw7qNdg{;3GPf#z6HC+E``O}hr%2g+J3Oe$y(2jkN@8eap!8HZaq5*g@w%hf|hNAb- zk)B4UtV6*Nfq`fQN1>6O68lV2*5At%oRh`qTWJ-#KG&ih*$^M!iYDt$bVSF{2%Sgo zzY?3_hVY^P}xnKvz*CbU+=@RnQZYzyH63f*Z?&=!2J|J%1Nn4ePNJeuj3SP@!u_JVnqB)WK|c6JP{wyT{JEEHysP09p8kv;dSXD5~I*n@K8GI-w`a}Kss)~c6b#`w?`i&Y~m#4~<;T;-TXO(PS-xcK9|-#i6(yhoh0onmV1IlMJJ(H1{xJwdiq7qrxIPCL(f)i) z!{!arl7Bg+b;C6NTM^b@_M1WkhM-gMH;%_FH>V~4WMmT7qJ9B8V(CU9N$ z9_ykb9fT&+6X*xXOXwE78H?djbooV1SuI51dMrYoEuQ(&##`g-V#J<^_^=~LPaKMdWFZyBe zGulw57Qy`Jh)ZJ|>=OHO?1|VaEyKv~NB4#2(1>kBL;pDz#pAIltrFpLxmc_4pqA)J zd!RQCLvvyxI@eRtIlhG1@Lx>FtgS=6A}*y~4_%huV;wBsCN25*0(zsb?^Wnqb$x6lcEUrNBI}rN~I*{)$Bc4S& zlDI^{P+vtymbHDDqx@(tltRz9LO;WAjeQ7hU?Dn^H_@qFjV9j?^npL3_g_SlF116b z7enq(MAaxbvU+F(L(pu00L$SNG>KNB*}egdz_)0FzoW^Ow_{iZMbI6vIy#{KXe91L z+Z}~Y-2<5X-~X9P!G`Cf4QO2@|=q7QC`uJ^uieRN!Z9G!|6(GQsg z=oBnMJG2^Y?|*0{4q)=n|Bh2|#v7tbyavj=YJE=zr*3 z??pRu41Mq^^ufQO56*H+IG+EOc>R~)fXP-5ZMY8_+NaUTEI~WA4voO4as3z?;!E-I zt7u1Zbq)6yLziD&wBw_(Exv`d@k&?LzoD+uE%dA|nhVX*5f4LmtVht1JdNr23i{v= z(T;9KuRDScL6dC&R>tXQ!yC{L@5AzV0*yef z9--k<_zU$0=*Y|58mx;wsJFqvxBy#Y#-4n}V@GsAiN`3IEVIyMG6x;Wi)c9#?T;0ykHF+A!JNMT7bFY3?a&8* z9M|`tBR`66G^fy=EmPm{B~%=Z+=EyKA3;aH6#b^$gbv^^+L80Ie`7o9*WN~ZuK(^7 z?AaJBfv;j!+>D0s5|+l)eqqkbp$}|?HaraN;JsKGXQLtBjMecN+VMR7Lk?BJbn3k^ z;fV(*xTQXiHn0*+zN6^*-_ccZ-R&VlHPMkaMX&3FuKRn?0Zc-(eF-`>tI#R?1dZsI zXoSAKo%QdHmpNeQGY<%Jm=8^wI_OKM30A>jnCvKe{YtchA7VZH8trJFfgy6W(Fe6a zH=h3JesCAsp@jnz;evNL;Ej9G50GDDa|{Z}Q~_IayjxtKhmLR?8i{>)AD%{6(d~o7 z1BRf>dR$yzfL^}}`{Awx1sf_iB-~IFU1lxfdQWuZ!_m;ah^hEG`q8-<-CB>KQ}G8n zfb2uVz{;b!(Hu+SAT%kb#wK2&U?|=}8`y+p@etaPlwsk+A}`v3w&;VqqDeRtT~6uF;`hqA@yN6)9DQ(0jQ>)&P9gadYD zF#3SeX!6}3I|EJ5`LXYzBixN%e;VEUFX2$kcTb4WgXjb2px4bu+g*y)@q>F<|Bmz= z2ON3vv1!RaPV0p=slSXiuovB;52NqxYwiupD;K6yFOP<_9o~ff(GJf;NBS;01-s(< z;n-gj6r9V<_k{=)#a7fSpbd^i&rd<8U_QFRyp7KF8uT6TVO-yZM)FH^N{^xY$Emnp zU|dM@B4{oos#0){JE9{Ugl%wS>^gJgrDo${}dcSR!lo5BnZq)!YZdkY=;YBbc_(7D@#Rq?C1e$4~%O9_owO)Q5G zqC4FZw4G1m`giCQWOy))JRc_i{qGv_fevVh??N9q5nZp3p^R=7*h)&U@`1tc^$KFOq zv=Qy_?znys?ck}{^YQV^XwF>oaM-YNW5PMCN5PRlh9=FkXag^z9eXW4zX~1c$7m!z zLm&J#I^yrKJpO?Wpct#m^L5d7nxGx-f<}V3Zz5T^J3cTW_AxXPGtmysiI2aGK6nZC z!Zm1zvOkiR{L5$s(fZx!{r96&l0f&1XVBI3HrkPGkI;bY^D7P*(zEEuuc9}mJsNJv zhki&@LN}ULXciAg8=eunEOuM$4`|4vN#VLI=!46k&#RlD-~}zwo_9tc&=>8%!?Cll z4E5L19c&kx6W^i@UPM1E(jE(;E`&y|B6_?AI?(p$^#jo0##>#jYD`J+Z{7%XB zUx&gFd>!lKHPga_n#FcRBhm}~uo#5N+=%P5(9ph#j&KXwvBT)reIC6&$CF{?=~#|> zJ4~2N_far8rlJpc6^+PxbY$DnP<|EHe~QmvK|7XddN`j8&5>g0{pHaltc#_w5!%tA zXonKhS^sw684lDHxtE20>FBZj#=+^oYnpE$j z4StL!>uz)eKcKmD32S4fxuJtMVRhX=TwGaC9aXvZEyLp&??C3L4-ghpl~zK`3{980{&z+C@VDLA4GFNO7b z1KLnM^uf*02HK&kqX+uHA!rBgK{uYs@$om%h`o#6{~@N~R&;CLiAEsxW!AqB%1yzB z3!!sa0llC)y6&5z4R%Ev?2FF*U^Mij(RKY87EfVI#&Y<-SHf5H&-23aE%Ivk&1y^Z zdGlXo{a2;%HV51)zr#wHGC$-*6|^J0&>M!MxiJAd;S1OTf5N#~c|o{;E1JxgV(YvX zjz55YH!Q;%nD%-iynO1s9_G3$x{uH4#~*PZR$CZW!yLSo`p;Mgn=A?+q4%RX zvk5()ZE;%iAGaBdF7NNq4is9F7QKt(5)^E>!W*F@Gtu?F9B;vs=m_gA4cVMPSIcUw zj7QLpW?dE@Tn9Zr3CrLLbSL~0y*|tGv}hLALpz?>MWH-})Hg#CRl4pMOLqqjrPi=(g4 z_UH)4;EnhqI)b(6y8aQ}!wakoQ+6|YUr+S-LukhrVFBEWKKLhewPbq7oM8Qxqfm+i zx1y1F2pi*4G^>9`JD9pEbf_d6()MVQO+u4+8~WhO*b0lR4($#_chDK=)_xqFqAY8O zwClen1$#OGU&g1fKbCtpeAQ0Fe$>CkaoBKe`1?O=uqO3u-wRW5Gx|~)kLJ{BG$Q%l zPkw4e^|2%MMC=|+7~;a~!k=!nKu9QyLO3zy;( z*axfpFD?2XPDht(yN|;Z48a-H=c4;ViA^DA#$s#guVXv>1-oFK&8&ZWJZ*Cb)h2Yk zpTx#k)tM;4Hi~ zh2-5C{<=Mr?=+r%fUbhG{-qP;DVP+QKMP4!8Vz+*^h2XJI?|Ex`H5%;=b{~1f;PAYjm#!=DDYIt9JZ4h@QZ0NsdYqdBk{T@Cs6gygJ- zF4w2f<7d#0T=RM8U>@|fT?mu^{aCE`k-QSK80|uRx(U2b|Lj{Z^wgZ2kU$hlCKjw(t&6P#-r^%ibn1kv?KG;DOmmm>)+(q$N`gPCpu?)&p$bE6O1-jirMPsitWGb~Pe+sSQ?vsq--HdO5SF1n9!;|OSRXgW$1kHfR`hU~ z`$ot>643|>uJ6(4NFGERo`oIRsouoP)c-mX{^rufZ^N%xhaC;C*~Ms%oW+@V2_4y_ z??ObTpv!wHrs8@uw>DyF*Z(IJ+__HU?f4HG`hLg4N8=Q{nfhAvJ^mXu$2P}9cF)8% z)Yo8n{0E0&+3&+nI19^Be;;l4IM%@|KhQqUkD5~Og3;(+{t~)@yo;Y=o*%Xe=cf?*)~AE_VPXaszD~h^TjVVZGTTo{_pqh#;qJ5@JCwo z6PCFgav|51Fa_Pw*o+7cOYkPFbu~O-EcU1VDE7tU=s#M2^WSO7e_OikKVfQ4qu-K=GXI8# zU&Z83h>l<k~?U5G#8qo z%l$#*If-a01?O%SmcjMt-hCVm)h}pd3a4gBZahuUIUSFU@C_`Dr_gqCq-98c@zg;# zs%OzD*n#H87ij4Jz~q1bpD{y*Vwt#J2aQMzbmQoNHrNeWRZ)L5as%V@ zqtF42!)x#n^!jP&b#u@NyoPyQ|8G%n2iuIU;~jDR2>SB*9!;jJ=th+-V}|70t0>yB zYG|nIp%1hEWevUTyJ({Fv&=I9&3JqpM z?<;`5PD`Q<*G41Q9Bro?I|LfuIL7ND}0FF0?5|gx*y6K?7QpJzd ze5llpepL#hcJd2EYloN`1%o){poK2#V8O``=%5Z_5kXF&I7lg2P_ctJ6tTD|sEbmN zivNG^Fw5_~%e~L@ydQU$DaId41yMy8IN?YdXrgOqqPu8-CuoOhH1I6C7v5tMKcY{- zh4}nmwD8uI(Gqr`aWeE_5w-p(8$kCOU*B8bsIj z6uNYm&>0EPyJHNEJC4SiKnuE$6cV&d#V1~%o8ndM92#&w{(cdy{3{yp7dB@k8x@j5 z`*)%vTN58|MEmui@phvFI*85x|2am(KDKK$qYtnjl24e~BiT zK}Yx&-OQiRI6u*X|Da2hYUlnpVU~s+)}n#8paHj|Yq%4=t{43U)Q{Wn4))+{^!>hs zdEC(vJ%G-l53sA~uD^*bnRN4$OYa@23{}UflVNo-@gp179w+v12rt`wd)xng-a966rs S>JA?^lHc3I=hu_dqyGRQ7`s{k diff --git a/locale/nl/LC_MESSAGES/django.po b/locale/nl/LC_MESSAGES/django.po index be28812..0206501 100644 --- a/locale/nl/LC_MESSAGES/django.po +++ b/locale/nl/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-11-13 23:31+0100\n" -"PO-Revision-Date: 2023-11-13 23:32+0018\n" +"POT-Creation-Date: 2023-12-11 22:08+0100\n" +"PO-Revision-Date: 2023-12-11 22:09+0018\n" "Last-Translator: <>\n" "Language: en\n" "MIME-Version: 1.0\n" @@ -1588,11 +1588,6 @@ msgid "Photo archive" msgstr "Foto-archief" #: amelie/activities/templates/gallery_overview.html:245 -#| msgid "" -#| "\n" -#| " The photo archive with photos from 2000 till march 2009 can be found on\n" -#| " foto.inter-actief.net.\n" -#| " " msgid "" "\n" " The photo archive with photos from 2000 till march 2009 can be found on\n" @@ -3089,6 +3084,21 @@ msgstr "Begin:" msgid "End (till)" msgstr "Einde (tot):" +#: amelie/companies/graphql.py:23 +#| msgid "Name (company)" +msgid "Name of the company" +msgstr "Naam van het bedrijf" + +#: amelie/companies/graphql.py:24 +#| msgid "Subject of the complaint" +msgid "Profile of the company" +msgstr "Profiel van het bedrijf" + +#: amelie/companies/graphql.py:25 +#| msgid "short description (en)" +msgid "Short description of the company" +msgstr "Korte beschrijving van het bedrijf" + #: amelie/companies/models.py:18 amelie/personal_tab/models.py:421 msgid "name" msgstr "naam" @@ -10053,19 +10063,19 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" -#: amelie/settings/generic.py:701 +#: amelie/settings/generic.py:702 msgid "Access to your name, date of birth, student number, mandate status and committee status." msgstr "Toegang tot je naam, geboortedatum, studentnummer, machtiging- en commissiestatus" -#: amelie/settings/generic.py:702 +#: amelie/settings/generic.py:703 msgid "Access to enrollments for activities and (un)enrolling you for activities." msgstr "Toegang tot inschrijvingen voor activiteiten en het in- en uitschrijven voor activiteiten" -#: amelie/settings/generic.py:703 +#: amelie/settings/generic.py:704 msgid "Access to transactions, direct debit transactions, mandates and RFID-cards." msgstr "Toegang tot transacties, incasso's, machtigingen en RFID-kaarten" -#: amelie/settings/generic.py:704 +#: amelie/settings/generic.py:705 msgid "Access to complaints and sending or supporting complaints in your name." msgstr "Toegang tot onderwijsklachten en het indienen of steunen van onderwijsklachten" From be20cc09226e5964bb30012776ff6463442eb26e Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 18 Mar 2024 22:32:31 +0100 Subject: [PATCH 15/29] WIP --- amelie/activities/graphql.py | 35 +++---------------- amelie/calendar/graphql.py | 65 ++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 30 deletions(-) create mode 100644 amelie/calendar/graphql.py diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index ddaec7e..55c9111 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -4,7 +4,7 @@ from graphene_django import DjangoObjectType from amelie.activities.models import Activity, ActivityLabel -from amelie.files.models import Attachment +from amelie.calendar.graphql import EventType from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField @@ -21,21 +21,13 @@ class Meta: } -class ActivityType(DjangoObjectType): +class ActivityType(EventType): + class Meta: model = Activity + + # Other fields are inherited from the EventType class fields = [ - "id", - "begin", - "end", - "entire_day", - "summary_nl", - "summary_en", - "promo_nl", - "promo_en", - "description_nl", - "description_en", - "organizer", "location", "public", "attachments", @@ -68,13 +60,8 @@ class Meta: enrollment_almost_full = graphene.Boolean(description=_('Whether this activity is almost full (<= 10 places left).')) has_enrollment_options = graphene.Boolean(description=_('If there are any options for enrollments.')) has_costs = graphene.Boolean(description=_('If there are any costs associated with this activity.')) - summary = graphene.String(description=_('A summary of this activity in the preferred language of this user.')) - description = graphene.String(description=_('A description of this activity in the preferred language of this user.')) - promo = graphene.String(description=_('Promotional text for this activity in the preferred language of this user.')) - description_short = graphene.String(description=_('A brief description of this activity (always in english).')) # TODO: Figure out on how to use foreign keys here! - def resolve_absolute_url(self: Activity, info): return self.get_absolute_url() @@ -116,18 +103,6 @@ def resolve_has_enrollment_option(self: Activity, info): def resolve_has_costs(self: Activity, info): return self.has_costs() - def resolve_summary(self: Activity, info): - return self.summary - - def resolve_description(self: Activity, info): - return self.description - - def resolve_promo(self: Activity, info): - return self.promo1 - - def resolve_description_short(self: Activity, info): - return self.description_short() - class ActivityLabelType(DjangoObjectType): class Meta: diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py new file mode 100644 index 0000000..c1faff9 --- /dev/null +++ b/amelie/calendar/graphql.py @@ -0,0 +1,65 @@ +import graphene +from graphene_django import DjangoObjectType + +from amelie.calendar.models import Event +from django.utils.translation import gettext_lazy as _ + +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + + +class EventType(DjangoObjectType): + """ + The event type used for GraphQL operations + """ + class Meta: + # Make sure that this type is not actually being registered. But it can be used by other types as a base class. + skip_registry = True + + model = Event + fields = [ + "pk", + "begin", + "end", + "entire_day", + "summary_nl", + "summary_en", + "promo_nl", + "promo_en", + "description_nl", + "description_en", + "organizer", + "location", + "public", + "dutch_activity", + "callback_url", + "organizer", + "committee", + "participation", + ] + + attachments = graphene.List(graphene.ID, description="Attachment ids") + summary = graphene.String(description=_('A summary of this activity in the preferred language of this user.')) + description = graphene.String( + description=_('A description of this activity in the preferred language of this user.')) + promo = graphene.String( + description=_('Promotional text for this activity in the preferred language of this user.')) + description_short = graphene.String(description=_('A brief description of this activity (always in english).')) + + def resolve_attachments(self: Event, info): + return self.attachments.values_list('id', flat=True) + + def resolve_summary(self: Event, info): + return self.summary + + def resolve_description(self: Event, info): + return self.description + + def resolve_promo(self: Event, info): + return self.promo + + def resolve_description_short(self: Event, info): + return self.description_short() + + +GRAPHQL_QUERIES = [] +GRAPHQL_MUTATIONS = [] From 2d2d63744f41830ef4373803a2064a27abaf1a96 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 3 Jun 2024 22:06:06 +0200 Subject: [PATCH 16/29] Add a query for a single activity given its id --- amelie/activities/graphql.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index ddaec7e..5ebb000 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -145,12 +145,18 @@ class Meta: class ActivitiesQuery(graphene.ObjectType): activities = DjangoPaginationConnectionField(ActivityType, organizer=graphene.ID()) + activity = graphene.Field(ActivityType, id=graphene.ID()) def resolve_activities(self, info, organizer=None, *args, **kwargs): if organizer: return Activity.objects.filter(organizer__pk=organizer) return Activity.objects.all() + def resolve_activity(self, info, id, *args, **kwargs): + if id: + return Activity.objects.get(pk=id) + return None + # Exports GRAPHQL_QUERIES = [ActivitiesQuery] GRAPHQL_MUTATIONS = [] From 782061d39a33103a2b09d31f192d6c023b6e2a40 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 10 Jun 2024 20:39:37 +0200 Subject: [PATCH 17/29] Add the calendar modules to all the different Event inheriters --- amelie/activities/graphql.py | 14 +++----- amelie/calendar/graphql.py | 3 +- amelie/companies/graphql.py | 62 ++++++++++++++++++++++++++++++++++-- amelie/education/graphql.py | 56 +++++++++++++++++++++++++++++--- 4 files changed, 116 insertions(+), 19 deletions(-) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index 55c9111..3c4ef32 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -28,11 +28,6 @@ class Meta: # Other fields are inherited from the EventType class fields = [ - "location", - "public", - "attachments", - "dutch_activity", - "callback_url", "enrollment", "enrollment_begin", "enrollment_end", @@ -44,7 +39,7 @@ class Meta: "can_unenroll", "image_icon", "activity_label" - ] + ].extend(EventType._meta.fields) filterset_class = ActivityFilterSet absolute_url = graphene.String(description=_('The absolute URL to an activity.')) @@ -61,7 +56,6 @@ class Meta: has_enrollment_options = graphene.Boolean(description=_('If there are any options for enrollments.')) has_costs = graphene.Boolean(description=_('If there are any costs associated with this activity.')) - # TODO: Figure out on how to use foreign keys here! def resolve_absolute_url(self: Activity, info): return self.get_absolute_url() @@ -75,10 +69,10 @@ def resolve_calendar_url(self: Activity, info): return self.get_calendar_url() def resolve_enrollment_open(self: Activity, info): - return self.get_enrollment_open() + return self.enrollment_open() def resolve_enrollment_closed(self: Activity, info): - return self.get_enrollment_closed() + return self.enrollment_closed() def resolve_can_edit(self: Activity, info): if hasattr(info.context.user, 'person'): @@ -98,7 +92,7 @@ def resolve_enrollment_almost_full(self: Activity, info): return self.enrollment_almost_full() def resolve_has_enrollment_option(self: Activity, info): - return self.has_enrollmentoption() + return self.has_enrollmentoptions() def resolve_has_costs(self: Activity, info): return self.has_costs() diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py index c1faff9..33b0363 100644 --- a/amelie/calendar/graphql.py +++ b/amelie/calendar/graphql.py @@ -4,6 +4,7 @@ from amelie.calendar.models import Event from django.utils.translation import gettext_lazy as _ +from amelie.files.graphql import AttachmentType from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField @@ -37,7 +38,7 @@ class Meta: "participation", ] - attachments = graphene.List(graphene.ID, description="Attachment ids") + attachments = graphene.List(AttachmentType, description="Attachment ids") summary = graphene.String(description=_('A summary of this activity in the preferred language of this user.')) description = graphene.String( description=_('A description of this activity in the preferred language of this user.')) diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py index e98d9a5..1798826 100644 --- a/amelie/companies/graphql.py +++ b/amelie/companies/graphql.py @@ -1,13 +1,14 @@ from django.utils.translation import gettext_lazy as _ import graphene +from django_filters import FilterSet from graphene_django import DjangoObjectType -from amelie.companies.models import Company, WebsiteBanner, TelevisionBanner, VivatBanner +from amelie.activities.graphql import ActivityLabelType +from amelie.calendar.graphql import EventType +from amelie.companies.models import Company, WebsiteBanner, TelevisionBanner, VivatBanner, CompanyEvent from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField -# Note: Company events are implemented in the calendar module (amelie/calendar/graphql.py) - class CompanyType(DjangoObjectType): class Meta: model = Company @@ -25,6 +26,53 @@ class Meta: short_description = graphene.String(description=_("Short description of the company")) +class CompanyEventFilterSet(FilterSet): + class Meta: + model = CompanyEvent + fields = { + 'id': ("exact", ), + 'summary_nl': ("icontains", "iexact"), + 'summary_en': ("icontains", "iexact"), + 'begin': ("gt", "lt", "exact"), + 'end': ("gt", "lt", "exact"), + 'dutch_activity': ("exact", ), + } + + +class CompanyEventType(EventType): + + class Meta: + model = CompanyEvent + fields = [ + "company", + "company_text", + "company_url", + "visible_from", + "visible_till" + ].extend(EventType._meta.fields) + filterset_class = CompanyEventFilterSet + + activity_label = graphene.Field(ActivityLabelType, description=_("The label that belongs to this activity")) + activity_type = graphene.String(description=_("The type of activity")) + calender_url = graphene.String(description=_("The url to the ics for this activity")) + absolute_url = graphene.String(description=_("The absolute URL to this event")) + is_visible = graphene.Boolean(description=_("Whether this event is visible")) + + def resolve_activity_label(self: CompanyEvent, info): + return self.activity_label + + def resolve_activity_type(self: CompanyEvent, info): + return self.activity_type + + def resolve_calendar_url(self: CompanyEvent, info): + return self.get_calendar_url() + + def resolve_absolute_url(self: CompanyEvent, info): + return self.get_absolute_url() + + def resolve_is_visible(self: CompanyEvent, info): + return self.is_visible() + class WebsiteBannerType(DjangoObjectType): class Meta: model = WebsiteBanner @@ -59,6 +107,9 @@ class CompaniesQuery(graphene.ObjectType): company = graphene.Field(CompanyType, id=graphene.ID(), slug=graphene.String()) companies = DjangoPaginationConnectionField(CompanyType) + company_event = graphene.Field(CompanyEventType, id=graphene.ID()) + company_events = DjangoPaginationConnectionField(CompanyEventType) + website_banner = graphene.Field(WebsiteBannerType, id=graphene.ID(), slug=graphene.String()) website_banners = DjangoPaginationConnectionField(WebsiteBannerType) @@ -82,6 +133,11 @@ def resolve_website_banner(self, info, id=None, slug=None): return WebsiteBanner.objects.get(slug=slug) return None + def resolve_company_event(self, info, id=None): + if id is not None: + return CompanyEvent.objects.get(pk=id) + return None + def resolve_television_banner(self, info, id=None, slug=None): if id is not None: return TelevisionBanner.objects.get(pk=id) diff --git a/amelie/education/graphql.py b/amelie/education/graphql.py index cdd264f..2e7f427 100644 --- a/amelie/education/graphql.py +++ b/amelie/education/graphql.py @@ -1,14 +1,14 @@ import graphene +from django_filters import FilterSet from graphene_django import DjangoObjectType from django.utils.translation import gettext_lazy as _ -from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField - -from amelie.education.models import Category, Page +from amelie.activities.graphql import ActivityLabelType +from amelie.calendar.graphql import EventType +from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField -# Notice: -# Education Events are implemented in amelie/calendar/graphql.py as part of the general event interface +from amelie.education.models import Category, Page, EducationEvent class EducationPageType(DjangoObjectType): @@ -53,6 +53,43 @@ def resolve_name(obj: Category, info): return obj.name +class EducationEventFilterSet(FilterSet): + class Meta: + model = EducationEvent + fields = { + 'id': ("exact",), + 'summary_nl': ("icontains", "iexact"), + 'summary_en': ("icontains", "iexact"), + 'begin': ("gt", "lt", "exact"), + 'end': ("gt", "lt", "exact"), + 'dutch_activity': ("exact",), + } + + +class EducationEventType(EventType): + + class Meta: + model = EducationEvent + + fields = [ + "education_organizer" + ].extend(EventType._meta.fields) + + filterset_class = EducationEventFilterSet + + activity_label = graphene.Field(ActivityLabelType) + activity_type = graphene.String(description="The type of event") + absolute_url = graphene.String(description="The absolute URL to this event") + + def resolve_activity_label(self: EducationEvent, info): + return self.activity_label + + def resolve_activity_type(self: EducationEvent, info): + return self.activity_type + + def resolve_absolute_url(self: EducationEvent, info): + return self.get_absolute_url() + class EducationQuery(graphene.ObjectType): educationpage_category = graphene.Field(EducationPageCategoryType, id=graphene.ID()) educationpage_categories = DjangoPaginationConnectionField(EducationPageCategoryType) @@ -60,6 +97,9 @@ class EducationQuery(graphene.ObjectType): educationpage = graphene.Field(EducationPageType, id=graphene.ID(), slug=graphene.String()) educationpages = DjangoPaginationConnectionField(EducationPageType) + education_event = graphene.Field(EducationEventType, id=graphene.ID()) + education_events = DjangoPaginationConnectionField(EducationEventType) + def resolve_educationpage_category(root, info, id=None): """Find education page category by ID""" if id is not None: @@ -74,6 +114,12 @@ def resolve_educationpage(root, info, id=None, slug=None): return Page.objects.get(slug=slug) return None + def resolve_education_event(self, id=None): + """Find education event by ID""" + if id is not None: + return EducationEvent.objects.get(pk=id) + return None + # Exports GRAPHQL_QUERIES = [EducationQuery] From 93b715775366fc31acef68db81efeffeadcda111 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 10 Jun 2024 20:46:50 +0200 Subject: [PATCH 18/29] Add translations --- locale/nl/LC_MESSAGES/django.mo | Bin 266226 -> 266669 bytes locale/nl/LC_MESSAGES/django.po | 109 +++++++++++++++++++------------- 2 files changed, 64 insertions(+), 45 deletions(-) diff --git a/locale/nl/LC_MESSAGES/django.mo b/locale/nl/LC_MESSAGES/django.mo index 3a2d12b2c2c22fd67c186fccd2394608dbe6f1e3..e034ecf4304e367028e4d2904278eb2ca4459cd0 100644 GIT binary patch delta 42138 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%0Aj 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\n" +"POT-Creation-Date: 2024-06-10 20:45+0200\n" +"PO-Revision-Date: 2024-06-10 20:46+0018\n" +"Last-Translator: Tom Meulenkamp <>\n" "Language: en\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -13,17 +13,14 @@ msgstr "" "X-Translated-Using: django-rosetta 0.9.9\n" #: amelie/about/graphql.py:16 -#| msgid "Person name" msgid "Page name" msgstr "Naam van de pagina" #: amelie/about/graphql.py:17 -#| msgid "Pages" msgid "Page slug" msgstr "Pagina slug" #: amelie/about/graphql.py:18 -#| msgid "Save comment" msgid "Page content" msgstr "Pagina inhoud" @@ -214,74 +211,58 @@ msgstr "Bestandsextensie \"%(extension)s\" is niet toegestaan. Toegestane bestan msgid "Activity" msgstr "Activiteit" -#: amelie/activities/graphql.py:58 +#: amelie/activities/graphql.py:45 msgid "The absolute URL to an activity." msgstr "De directe link naar de URL van deze activiteit." -#: amelie/activities/graphql.py:59 +#: amelie/activities/graphql.py:46 msgid "A URL to a random picture that was made at this activity." msgstr "Een URL van een willekeurige foto die gemaakt is op deze activiteit." -#: amelie/activities/graphql.py:60 +#: amelie/activities/graphql.py:47 msgid "A URL that points to the picture gallery for this activity." msgstr "Een URL die naar de foto gallerij van deze activiteit wijst." -#: amelie/activities/graphql.py:61 +#: amelie/activities/graphql.py:48 msgid "A link to the ICS file for this activity." msgstr "Een link naar het ICS bestand voor deze activiteit." -#: amelie/activities/graphql.py:62 +#: amelie/activities/graphql.py:49 msgid "Whether people can still enroll for this activity." msgstr "Of mensen zich nog kunnen inschrijven voor deze activiteit." -#: amelie/activities/graphql.py:63 +#: amelie/activities/graphql.py:50 msgid "Whether people can no longer enroll for this activity." msgstr "Of mensen zich niet langer kunnen inschrijven voor deze activiteit." -#: amelie/activities/graphql.py:64 +#: amelie/activities/graphql.py:51 msgid "Whether the person that is currently signed-in can edit this activity." msgstr "Of de persoon die nu is ingelogd deze activeit kan bewerken." -#: amelie/activities/graphql.py:65 +#: amelie/activities/graphql.py:52 msgid "The amount of open spots that are still available." msgstr "Hoeveel plekken er nog vrij zijn." -#: amelie/activities/graphql.py:66 +#: amelie/activities/graphql.py:53 msgid "Whether this activity is full." msgstr "Of deze activiteit vol is." -#: amelie/activities/graphql.py:67 +#: amelie/activities/graphql.py:54 msgid "Whether this activity has any participations that are on the waiting list." msgstr "Of deze activiteit inschrijvingen op de wachtlijst heeft staan." -#: amelie/activities/graphql.py:68 +#: amelie/activities/graphql.py:55 msgid "Whether this activity is almost full (<= 10 places left)." msgstr "Of deze activiteit bijna vol is (<= 10 plekken over)." -#: amelie/activities/graphql.py:69 +#: amelie/activities/graphql.py:56 msgid "If there are any options for enrollments." msgstr "Of er inschrijf mogelijkheden zijn." -#: amelie/activities/graphql.py:70 +#: amelie/activities/graphql.py:57 msgid "If there are any costs associated with this activity." msgstr "Of er kosten vastzitten aan deze activiteit." -#: amelie/activities/graphql.py:71 -msgid "A summary of this activity in the preferred language of this user." -msgstr "Een samenvatting van deze activiteit in de voorkeurstaal van de gebruiker." - -#: amelie/activities/graphql.py:72 -msgid "A description of this activity in the preferred language of this user." -msgstr "Een beschrijving van deze activiteit in de voorkeurstaal van de gebruiker." - -#: amelie/activities/graphql.py:73 -msgid "Promotional text for this activity in the preferred language of this user." -msgstr "Een promo tekst van deze activiteit in de voorkeurstaal van de gebruiker." - -#: amelie/activities/graphql.py:74 -msgid "A brief description of this activity (always in english)." -msgstr "Een korte beschrijving van deze activiteit (altijd in het Engels)" - #: amelie/activities/mail.py:39 amelie/activities/mail.py:41 amelie/activities/mail.py:84 amelie/activities/mail.py:86 msgid "Inter-Activity" msgstr "Inter-Activiteit" @@ -2234,6 +2215,22 @@ msgstr "Kies het model waar je de geschiedenis van wilt zien:" msgid "And {} other changes" msgstr "En nog {} andere wijzigingen." +#: amelie/calendar/graphql.py:42 +msgid "A summary of this activity in the preferred language of this user." +msgstr "Een samenvatting van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/calendar/graphql.py:44 +msgid "A description of this activity in the preferred language of this user." +msgstr "Een beschrijving van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/calendar/graphql.py:46 +msgid "Promotional text for this activity in the preferred language of this user." +msgstr "Een promo tekst van deze activiteit in de voorkeurstaal van de gebruiker." + +#: amelie/calendar/graphql.py:47 +msgid "A brief description of this activity (always in english)." +msgstr "Een korte beschrijving van deze activiteit (altijd in het Engels)" + #: amelie/calendar/models.py:22 msgid "No payment" msgstr "Geen betaling" @@ -3099,21 +3096,43 @@ msgstr "Begin:" msgid "End (till)" msgstr "Einde (tot):" -#: amelie/companies/graphql.py:23 -#| msgid "Name (company)" +#: amelie/companies/graphql.py:24 msgid "Name of the company" msgstr "Naam van het bedrijf" -#: amelie/companies/graphql.py:24 -#| msgid "Subject of the complaint" +#: amelie/companies/graphql.py:25 msgid "Profile of the company" msgstr "Profiel van het bedrijf" -#: amelie/companies/graphql.py:25 -#| msgid "short description (en)" +#: amelie/companies/graphql.py:26 msgid "Short description of the company" msgstr "Korte beschrijving van het bedrijf" +#: amelie/companies/graphql.py:55 +#| msgid "There are no messages for this activity" +msgid "The label that belongs to this activity" +msgstr "Het label dat bij deze activiteit hoort" + +#: amelie/companies/graphql.py:56 +#| msgid "Link to activity" +msgid "The type of activity" +msgstr "Het type activiteit" + +#: amelie/companies/graphql.py:57 +#| msgid "A link to the ICS file for this activity." +msgid "The url to the ics for this activity" +msgstr "Een link naar het ICS bestand voor deze activiteit" + +#: amelie/companies/graphql.py:58 +#| msgid "The absolute URL to an activity." +msgid "The absolute URL to this event" +msgstr "De directe link naar de URL van deze activiteit" + +#: amelie/companies/graphql.py:59 +#| msgid "Whether this activity is full." +msgid "Whether this event is visible" +msgstr "Of deze activiteit zichtbaar is" + #: amelie/companies/models.py:18 amelie/personal_tab/models.py:421 msgid "name" msgstr "naam" @@ -10078,19 +10097,19 @@ msgstr "Nederlands" msgid "English" msgstr "Engels" -#: amelie/settings/generic.py:702 +#: amelie/settings/generic.py:703 msgid "Access to your name, date of birth, student number, mandate status and committee status." msgstr "Toegang tot je naam, geboortedatum, studentnummer, machtiging- en commissiestatus" -#: amelie/settings/generic.py:703 +#: amelie/settings/generic.py:704 msgid "Access to enrollments for activities and (un)enrolling you for activities." msgstr "Toegang tot inschrijvingen voor activiteiten en het in- en uitschrijven voor activiteiten" -#: amelie/settings/generic.py:704 +#: amelie/settings/generic.py:705 msgid "Access to transactions, direct debit transactions, mandates and RFID-cards." msgstr "Toegang tot transacties, incasso's, machtigingen en RFID-kaarten" -#: amelie/settings/generic.py:705 +#: amelie/settings/generic.py:706 msgid "Access to complaints and sending or supporting complaints in your name." msgstr "Toegang tot onderwijsklachten en het indienen of steunen van onderwijsklachten" From c941e826c235364c9301c1874b79f1a941798897 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 10 Jun 2024 22:43:17 +0200 Subject: [PATCH 19/29] Add mutation for the educational bouquet --- amelie/education/graphql.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/amelie/education/graphql.py b/amelie/education/graphql.py index cdd264f..cff0ba4 100644 --- a/amelie/education/graphql.py +++ b/amelie/education/graphql.py @@ -2,9 +2,14 @@ from graphene_django import DjangoObjectType from django.utils.translation import gettext_lazy as _ +from graphene_django.forms.mutation import DjangoFormMutation + +from amelie import settings +from amelie.education.forms import EducationalBouquetForm from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField from amelie.education.models import Category, Page +from amelie.iamailer import MailTask, Recipient # Notice: @@ -75,6 +80,15 @@ def resolve_educationpage(root, info, id=None, slug=None): return None +class EducationalBouquetMutation(DjangoFormMutation): + + class Meta: + form_class = EducationalBouquetForm + +class EducationMutation: + educational_bouquet = EducationalBouquetMutation.Field() + + # Exports GRAPHQL_QUERIES = [EducationQuery] -GRAPHQL_MUTATIONS = [] +GRAPHQL_MUTATIONS = [EducationMutation] From 104ead3d9f59a1086595d53b13b72733d48913fc Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Sat, 7 Sep 2024 14:57:35 +0200 Subject: [PATCH 20/29] graphql: Fix invalid fields showing up for Event Types, remove some private fields for Events and Committees --- amelie/activities/graphql.py | 12 ++-------- amelie/calendar/graphql.py | 43 ++++++++++++++++++------------------ amelie/companies/graphql.py | 4 ++-- amelie/education/graphql.py | 4 ++-- amelie/members/graphql.py | 1 - 5 files changed, 28 insertions(+), 36 deletions(-) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index 23e8d63..574e973 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -4,7 +4,7 @@ from graphene_django import DjangoObjectType from amelie.activities.models import Activity, ActivityLabel -from amelie.calendar.graphql import EventType +from amelie.calendar.graphql import EventType, EVENT_TYPE_BASE_FIELDS from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField @@ -39,7 +39,7 @@ class Meta: "can_unenroll", "image_icon", "activity_label" - ].extend(EventType._meta.fields) + ] + EVENT_TYPE_BASE_FIELDS filterset_class = ActivityFilterSet absolute_url = graphene.String(description=_('The absolute URL to an activity.')) @@ -49,9 +49,7 @@ class Meta: enrollment_open = graphene.Boolean(description=_('Whether people can still enroll for this activity.')) enrollment_closed = graphene.Boolean(description=_('Whether people can no longer enroll for this activity.')) can_edit = graphene.Boolean(description=_('Whether the person that is currently signed-in can edit this activity.')) - places_available = graphene.Int(description=_('The amount of open spots that are still available.')) enrollment_full = graphene.Boolean(description=_('Whether this activity is full.')) - has_waiting_participants = graphene.Boolean(description=_('Whether this activity has any participations that are on the waiting list.')) enrollment_almost_full = graphene.Boolean(description=_('Whether this activity is almost full (<= 10 places left).')) has_enrollment_options = graphene.Boolean(description=_('If there are any options for enrollments.')) has_costs = graphene.Boolean(description=_('If there are any costs associated with this activity.')) @@ -79,15 +77,9 @@ def resolve_can_edit(self: Activity, info): return self.can_edit(info.context.user.person) return False - def resolve_places_available(self: Activity, info): - return self.places_available() - def resolve_enrollment_full(self: Activity, info): return self.enrollment_full() - def resolve_has_waiting_participants(self: Activity, info): - return self.has_waiting_participants() - def resolve_enrollment_almost_full(self: Activity, info): return self.enrollment_almost_full() diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py index 33b0363..cc086f7 100644 --- a/amelie/calendar/graphql.py +++ b/amelie/calendar/graphql.py @@ -5,38 +5,39 @@ from django.utils.translation import gettext_lazy as _ from amelie.files.graphql import AttachmentType -from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField + + +# Specified separately from EventType.Meta to be able to use it in the Meta class of subclasses. +EVENT_TYPE_BASE_FIELDS = [ + "begin", + "end", + "entire_day", + "summary_nl", + "summary_en", + "promo_nl", + "promo_en", + "description_nl", + "description_en", + "organizer", + "location", + "public", + "dutch_activity", + "organizer", + "participation", +] class EventType(DjangoObjectType): """ The event type used for GraphQL operations """ + class Meta: # Make sure that this type is not actually being registered. But it can be used by other types as a base class. skip_registry = True model = Event - fields = [ - "pk", - "begin", - "end", - "entire_day", - "summary_nl", - "summary_en", - "promo_nl", - "promo_en", - "description_nl", - "description_en", - "organizer", - "location", - "public", - "dutch_activity", - "callback_url", - "organizer", - "committee", - "participation", - ] + fields = EVENT_TYPE_BASE_FIELDS attachments = graphene.List(AttachmentType, description="Attachment ids") summary = graphene.String(description=_('A summary of this activity in the preferred language of this user.')) diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py index 1798826..4ca69a4 100644 --- a/amelie/companies/graphql.py +++ b/amelie/companies/graphql.py @@ -4,7 +4,7 @@ from graphene_django import DjangoObjectType from amelie.activities.graphql import ActivityLabelType -from amelie.calendar.graphql import EventType +from amelie.calendar.graphql import EventType, EVENT_TYPE_BASE_FIELDS from amelie.companies.models import Company, WebsiteBanner, TelevisionBanner, VivatBanner, CompanyEvent from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField @@ -49,7 +49,7 @@ class Meta: "company_url", "visible_from", "visible_till" - ].extend(EventType._meta.fields) + ] + EVENT_TYPE_BASE_FIELDS filterset_class = CompanyEventFilterSet activity_label = graphene.Field(ActivityLabelType, description=_("The label that belongs to this activity")) diff --git a/amelie/education/graphql.py b/amelie/education/graphql.py index f1a6699..a9282c2 100644 --- a/amelie/education/graphql.py +++ b/amelie/education/graphql.py @@ -13,7 +13,7 @@ from amelie.iamailer import MailTask, Recipient from amelie.activities.graphql import ActivityLabelType -from amelie.calendar.graphql import EventType +from amelie.calendar.graphql import EventType, EVENT_TYPE_BASE_FIELDS from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField from amelie.education.models import Category, Page, EducationEvent @@ -81,7 +81,7 @@ class Meta: fields = [ "education_organizer" - ].extend(EventType._meta.fields) + ] + EVENT_TYPE_BASE_FIELDS filterset_class = EducationEventFilterSet diff --git a/amelie/members/graphql.py b/amelie/members/graphql.py index 921ccab..0ad3ab7 100644 --- a/amelie/members/graphql.py +++ b/amelie/members/graphql.py @@ -77,7 +77,6 @@ class Meta: fields = [ "id", "name", - "abbreviation", "category", "parent_committees", "slug", From 6bb97004d3c1103a0d4e2a8af8b737525b93d258 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 16 Sep 2024 18:26:58 +0200 Subject: [PATCH 21/29] graphql: Fix non-public attachments and photos, inactive banners, and start and end date for banners being exposed. --- amelie/activities/graphql.py | 4 ++++ amelie/calendar/graphql.py | 3 ++- amelie/companies/graphql.py | 23 ++++++++++++++++------- amelie/files/graphql.py | 3 ++- amelie/news/graphql.py | 4 ++++ amelie/settings/generic.py | 7 ++++++- 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index 574e973..b223c17 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -54,6 +54,10 @@ class Meta: has_enrollment_options = graphene.Boolean(description=_('If there are any options for enrollments.')) has_costs = graphene.Boolean(description=_('If there are any costs associated with this activity.')) + def resolve_photos(self: Activity, info): + # `info.context` is the Django Request object in Graphene + return self.photos.filter_public(info.context).all() + def resolve_absolute_url(self: Activity, info): return self.get_absolute_url() diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py index cc086f7..af3e966 100644 --- a/amelie/calendar/graphql.py +++ b/amelie/calendar/graphql.py @@ -48,7 +48,8 @@ class Meta: description_short = graphene.String(description=_('A brief description of this activity (always in english).')) def resolve_attachments(self: Event, info): - return self.attachments.values_list('id', flat=True) + # `info.context` is the Django Request object in Graphene + return self.attachments.filter_public(info.context).values_list('id', flat=True) def resolve_summary(self: Event, info): return self.summary diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py index 4ca69a4..c0075b4 100644 --- a/amelie/companies/graphql.py +++ b/amelie/companies/graphql.py @@ -80,7 +80,7 @@ class Meta: filter_fields = { "name": ("icontains", "iexact"), } - fields = ["picture", "name", "slug", "start_date", "end_date", "active", "url"] + fields = ["picture", "name", "slug", "active", "url"] class TelevisionBannerType(DjangoObjectType): @@ -90,7 +90,7 @@ class Meta: filter_fields = { "name": ("icontains", "iexact"), } - fields = ["picture", "name", "slug", "start_date", "end_date", "active"] + fields = ["picture", "name", "slug", "active"] class VivatBannerType(DjangoObjectType): @@ -100,7 +100,7 @@ class Meta: filter_fields = { "name": ("icontains", "iexact"), } - fields = ["picture", "name", "slug", "start_date", "end_date", "active", "url"] + fields = ["picture", "name", "slug", "active", "url"] class CompaniesQuery(graphene.ObjectType): @@ -126,6 +126,11 @@ def resolve_company(self, info, id=None, slug=None): return Company.objects.get(slug=slug) return None + def resolve_company_event(self, info, id=None): + if id is not None: + return CompanyEvent.objects.get(pk=id) + return None + def resolve_website_banner(self, info, id=None, slug=None): if id is not None: return WebsiteBanner.objects.get(pk=id) @@ -133,10 +138,8 @@ def resolve_website_banner(self, info, id=None, slug=None): return WebsiteBanner.objects.get(slug=slug) return None - def resolve_company_event(self, info, id=None): - if id is not None: - return CompanyEvent.objects.get(pk=id) - return None + def resolve_website_banners(self, info, *args, **kwargs): + return WebsiteBanner.objects.filter(active=True) def resolve_television_banner(self, info, id=None, slug=None): if id is not None: @@ -145,6 +148,9 @@ def resolve_television_banner(self, info, id=None, slug=None): return TelevisionBanner.objects.get(slug=slug) return None + def resolve_television_banners(self, info, *args, **kwargs): + return TelevisionBanner.objects.filter(active=True) + def resolve_vivat_banner(self, info, id=None, slug=None): if id is not None: return VivatBanner.objects.get(pk=id) @@ -152,6 +158,9 @@ def resolve_vivat_banner(self, info, id=None, slug=None): return VivatBanner.objects.get(slug=slug) return None + def resolve_vivat_banners(self, info, *args, **kwargs): + return VivatBanner.objects.filter(active=True) + # Exports GRAPHQL_QUERIES = [CompaniesQuery] diff --git a/amelie/files/graphql.py b/amelie/files/graphql.py index fe50ead..de58d4c 100644 --- a/amelie/files/graphql.py +++ b/amelie/files/graphql.py @@ -31,7 +31,8 @@ class FilesQuery(graphene.ObjectType): attachment = graphene.Field(AttachmentType, id=graphene.ID()) def resolve_attachment(root, info, id): - return Attachment.objects.get(pk=id) + # `info.context` is the Django Request object in Graphene + return Attachment.objects.filter_public(info.context).get(pk=id) GRAPHQL_QUERIES = [FilesQuery] diff --git a/amelie/news/graphql.py b/amelie/news/graphql.py index 659809f..0a25e6f 100644 --- a/amelie/news/graphql.py +++ b/amelie/news/graphql.py @@ -43,6 +43,10 @@ class Meta: introduction = graphene.String(description=_("Message introduction (localized for user)")) content = graphene.String(description=_("Message content (localized for user)")) + def resolve_attachments(self: NewsItem, info): + # `info.context` is the Django Request object in Graphene + return self.attachments.filter_public(info.context).all() + def resolve_author(obj: NewsItem, info): return obj.author.incomplete_name() diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index 7270d24..3ac8c4f 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -725,9 +725,14 @@ # SAML2 Identity Provider configuration SAML_BASE_URL = "https://www.inter-actief.utwente.nl/saml2idp" +try: + xmlsec_binary = get_xmlsec_binary(['/opt/local/bin', '/usr/bin/xmlsec1']) +except saml2.sigver.SigverError: + print("Could not find xmlsec1 binary for SAML. Continuing with no xmlsec configured, SAML2 IDP will not work.") + xmlsec_binary = None SAML_IDP_CONFIG = { 'debug': 0, - 'xmlsec_binary': get_xmlsec_binary(['/opt/local/bin', '/usr/bin/xmlsec1']), + 'xmlsec_binary': xmlsec_binary, 'entityid': '%s/metadata' % SAML_BASE_URL, 'description': 'Inter-Actief SAML IdP', From 686bc5806d1969ea5d6d0aa6f66e764179e4e1be Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 30 Sep 2024 22:15:53 +0200 Subject: [PATCH 22/29] graphql: Initial framework for testing private models and fields --- amelie/about/graphql.py | 1 - amelie/activities/graphql.py | 6 +- amelie/api/test_activitystream.py | 75 +++------------- amelie/calendar/graphql.py | 1 + amelie/graphql/tests.py | 138 +++++++++++++++++++++++++++++- amelie/settings/generic.py | 3 +- amelie/tools/tests.py | 54 ++++++++++++ 7 files changed, 208 insertions(+), 70 deletions(-) diff --git a/amelie/about/graphql.py b/amelie/about/graphql.py index ad3d313..4539feb 100644 --- a/amelie/about/graphql.py +++ b/amelie/about/graphql.py @@ -4,7 +4,6 @@ from graphene_django import DjangoObjectType from amelie.about.models import Page -from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField class PageType(DjangoObjectType): diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index b223c17..9a4d394 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -114,12 +114,12 @@ class ActivitiesQuery(graphene.ObjectType): def resolve_activities(self, info, organizer=None, *args, **kwargs): if organizer: - return Activity.objects.filter(organizer__pk=organizer) - return Activity.objects.all() + return Activity.objects.filter_public(info.context).filter(organizer__pk=organizer) + return Activity.objects.filter_public(info.context) def resolve_activity(self, info, id, *args, **kwargs): if id: - return Activity.objects.get(pk=id) + return Activity.objects.filter_public(info.context).get(pk=id) return None # Exports diff --git a/amelie/api/test_activitystream.py b/amelie/api/test_activitystream.py index 2ca26b7..14329e2 100644 --- a/amelie/api/test_activitystream.py +++ b/amelie/api/test_activitystream.py @@ -1,66 +1,15 @@ from __future__ import division, absolute_import, print_function, unicode_literals import datetime -import random from decimal import Decimal -from django.contrib.contenttypes.models import ContentType from django.utils import timezone -from amelie.activities.models import Activity, EnrollmentoptionQuestion, EnrollmentoptionCheckbox, EnrollmentoptionFood, \ - Restaurant, ActivityLabel +from amelie.activities.models import Activity, EnrollmentoptionQuestion, EnrollmentoptionCheckbox, EnrollmentoptionFood from amelie.api.common import strip_markdown -from amelie.members.models import Committee from amelie.personal_tab.models import Authorization, AuthorizationType from amelie.tools.templatetags import md -from amelie.tools.tests import APITestCase - - -def _gen_activities(count): - """ - Generate activities. - - Half of the activities is private. - - :param int count: Number of activities to generate. - """ - - now = timezone.now() - committee = Committee.objects.all()[0] - - restaurant = Restaurant(name='Test Restaurant') - restaurant.save() - restaurant.dish_set.create(name='Dish 1', price=33.42) - restaurant.dish_set.create(name='Dish 2', price=13.37) - label = ActivityLabel.objects.create(name_en="Test EN", name_nl="Test NL", color="000000", icon="-", explanation_en="-", - explanation_nl="-") - - for i in range(0, count): - public = bool(i % 2) - - start = now + datetime.timedelta(days=i, seconds=random.uniform(0, 5*3600)) - end = start + datetime.timedelta(seconds=random.uniform(3600, 10*3600)) - - activity = Activity(begin=start, end=end, summary_nl='Test Activity %i' % i, - summary_en='Test event %i' % i, - organizer=committee, public=public, activity_label=label) - activity.save() - - ct_question = ContentType.objects.get_for_model(EnrollmentoptionQuestion) - ct_checkbox = ContentType.objects.get_for_model(EnrollmentoptionCheckbox) - ct_food = ContentType.objects.get_for_model(EnrollmentoptionFood) - - EnrollmentoptionQuestion(activity=activity, title='Optional question %i' % i, content_type=ct_question, - required=False).save() - EnrollmentoptionQuestion(activity=activity, title='Mandatory question %i' % i, content_type=ct_question, - required=True).save() - EnrollmentoptionCheckbox(activity=activity, title='Free checkbox %i' % i, content_type=ct_checkbox).save() - EnrollmentoptionCheckbox(activity=activity, title='Paid checkbox %i' % i, content_type=ct_checkbox, - price_extra=42.33).save() - EnrollmentoptionFood(activity=activity, title='Voluntary food %i' % i, content_type=ct_food, - restaurant=restaurant, required=False).save() - EnrollmentoptionFood(activity=activity, title='Mandatory food %i' % i, content_type=ct_food, - restaurant=restaurant, required=False).save() +from amelie.tools.tests import APITestCase, generate_activities def _activity_data(activity, signedup=False): @@ -176,7 +125,7 @@ def test_public(self): """ Test the getActivityDetailed() call with public events. """ - _gen_activities(10) + generate_activities(10) activities = Activity.objects.filter_public(True) for activity in activities: @@ -191,7 +140,7 @@ def test_private(self): """ Test the getActivityDetailed() call with private events. """ - _gen_activities(10) + generate_activities(10) activities = Activity.objects.filter_public(False) for activity in activities: @@ -202,7 +151,7 @@ def test_invalid_token(self): """ Test the getActivityDetailed() call with private events and an invalid token. """ - _gen_activities(10) + generate_activities(10) activities = Activity.objects.filter(public=False) for activity in activities: @@ -225,7 +174,7 @@ def test_public(self): """ Test the getActivityStream() call with public events. """ - _gen_activities(10) + generate_activities(10) activities = Activity.objects.filter_public(True)[2:4] start = self.isodate_param(activities[0].begin) @@ -243,7 +192,7 @@ def test_private(self): """ Test the getActivityStream() call with private events. """ - _gen_activities(10) + generate_activities(10) activities = Activity.objects.filter_public(True)[4:8] start = self.isodate_param(activities[0].begin) @@ -261,7 +210,7 @@ def test_invalid_token(self): """ Test the getActivityStream() call with an invalid token. """ - _gen_activities(10) + generate_activities(10) start = self.isodate_param(timezone.now()) end = self.isodate_param(timezone.now() + datetime.timedelta(days=31)) @@ -282,7 +231,7 @@ def test_public(self): """ Test the getUpcomingActivities() call with public events. """ - _gen_activities(10) + generate_activities(10) expected_result = [_activity_data(a) for a in Activity.objects.filter_public(True)[:1]] self.send_and_compare_request('getUpcomingActivities', [1], None, expected_result) @@ -297,7 +246,7 @@ def test_private(self): """ Test the getUpcomingActivities() call with private events. """ - _gen_activities(10) + generate_activities(10) expected_result = [_activity_data(a) for a in Activity.objects.filter_public(False)[:1]] self.send_and_compare_request('getUpcomingActivities', [1], self.data['token1'], expected_result) @@ -312,7 +261,7 @@ def test_invalid_token(self): """ Test the getUpcomingActivities() call with an invalid token. """ - _gen_activities(10) + generate_activities(10) expected_result = [_activity_data(a) for a in Activity.objects.filter_public(True)] self.send_and_compare_request('getUpcomingActivities', [10], 'qNPiKNn3McZIC6fWKE1X', expected_result) @@ -323,7 +272,7 @@ class ActivitySignupTest(APITestCase): def setUp(self): super(ActivitySignupTest, self).setUp() - _gen_activities(1) + generate_activities(1) self.activity = Activity.objects.get() self.activity.enrollment = True self.activity.enrollment_begin = timezone.now() - datetime.timedelta(hours=1) diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py index af3e966..149e627 100644 --- a/amelie/calendar/graphql.py +++ b/amelie/calendar/graphql.py @@ -9,6 +9,7 @@ # Specified separately from EventType.Meta to be able to use it in the Meta class of subclasses. EVENT_TYPE_BASE_FIELDS = [ + "id", "begin", "end", "entire_day", diff --git a/amelie/graphql/tests.py b/amelie/graphql/tests.py index 7ce503c..92ab6e4 100644 --- a/amelie/graphql/tests.py +++ b/amelie/graphql/tests.py @@ -1,3 +1,137 @@ -from django.test import TestCase +import json +import re +from typing import Optional, Dict, Tuple -# Create your tests here. +from graphene_django.utils.testing import GraphQLTestMixin + +from amelie.activities.models import Activity +from amelie.tools.tests import TestCase, generate_activities + + +class GraphQLPrivateFieldTests(GraphQLTestMixin, TestCase): + MODEL_ERROR_REGEX = re.compile(r".* matching query does not exist\.") + FIELD_ERROR_REGEX = re.compile(r"Cannot query field .*") + + def setUp(self): + super(GraphQLPrivateFieldTests, self).setUp() + self.load_basic_data() + generate_activities(2) + self.public_activity = Activity.objects.filter(public=True).order_by('-id').first() + self.private_activity = Activity.objects.filter(public=False).order_by('-id').first() + + def _test_private_model(self, query_name: str, public_field_spec: str = "id", + variables: Optional[Dict[str, Tuple[str, str]]] = None): + """ + Test if a model instance that should be private is actually not accessible via GraphQL. + + :param query_name: The GraphQL query name to test. I.E. activity in `query{activity(id: 1){ ... }}` + :type query_name: str + + :param public_field_spec: Specification of a public field that is queryable on public instances of the model. + This can be a simple name of a field, or a field in some nested object. + For example for activity: "id" or "photos { created }" + :type public_field_spec: str + + :param variables: A dictionary of variables used in the GraphQL query to select the instance. + Key is the variable name, value is a tuple with the value, and the GraphQL type of the var. + For example to select an activity by ID: {'id': (1, 'ID')} + Or a committee by its slug: {'slug': ('www', 'String')} + :type variables: Optional[Dict[str, Tuple[str, str]]] + """ + params = ", ".join(f"{k}: ${k}" for k in variables.keys()) if variables else "" + param_types = ", ".join(f"${k}: {v[1]}" for k, v in variables.items()) if variables else "" + param_types = f"({param_types})" if param_types else "" + query_variables = {x: v[0] for x, v in variables.items()} + query = f''' + query {param_types} {{ + {query_name}({params}) {{ + {public_field_spec} + }} + }} + ''' + response = self.query(query, variables=query_variables) + + print(query, query_variables) + + self.assertResponseHasErrors( + response, + f"Query for '{query_name}', private object '{query_variables}' does not return an error!" + ) + # Check if the error received has the correct error message format, so we don't + # accidentally consider a different error as a 'successful' result. + content = json.loads(response.content) + for error in content['errors']: + # If different error than expected, throw error. + self.assertRegex( + error['message'], GraphQLPrivateFieldTests.MODEL_ERROR_REGEX, + f"Query for '{query_name}', private object '{query_variables}' raised a different error than expected!\n" + f"{error['message']}" + ) + + def _test_public_model_and_private_field(self, query_name: str, field_name: str, field_spec: str, + variables: Optional[Dict[str, Tuple[str, str]]] = None): + """ + Test if a field that should be private on a model instance is actually not accessible via GraphQL. + + :param query_name: The GraphQL query name to test. I.E. activity in `query{activity(id: 1){ ... }}` + :type query_name: str + + :param field_name: User-friendly name of the GraphQL field name being tested. Only used in log messages. + :type field_name: str + + :param field_spec: Specification of a private field that needs to be tested for privateness. + This can be a simple name of a field, or a field in some nested object. + For example for activity: "id" or "photos { created }" + :type field_spec: str + + :param variables: A dictionary of variables used in the GraphQL query to select the instance. + Key is the variable name, value is a tuple with the value, and the GraphQL type of the var. + For example to select an activity by ID: {'id': (1, 'ID')} + Or a committee by its slug: {'slug': ('www', 'String')} + :type variables: Optional[Dict[str, Tuple[str, str]]] + """ + params = ", ".join(f"{k}: ${k}" for k in variables.keys()) if variables else "" + param_types = ", ".join(f"${k}: {v[1]}" for k, v in variables.items()) if variables else "" + param_types = f"({param_types})" if param_types else "" + query_variables = {x: v[0] for x, v in variables.items()} + query = f''' + query {param_types} {{ + {query_name}({params}) {{ + {field_spec} + }} + }} + ''' + response = self.query(query, variables=query_variables) + self.assertResponseHasErrors( + response, + f"Query for '{query_name}', private field spec '{field_name}' does not return an error!" + ) + # Check if the error received has the correct error message format, so we don't + # accidentally consider a different error as a 'successful' result. + content = json.loads(response.content) + for error in content['errors']: + # If different error than expected, throw error. + self.assertRegex( + error['message'], GraphQLPrivateFieldTests.FIELD_ERROR_REGEX, + f"Query for '{query_name}', private field spec '{field_name}' raised a different error than expected!\n" + f"{error['message']}" + ) + + def test_activity_private_fields(self): + fields: Dict[str, str] = { + "facebook_event_id": "facebook_event_id", + "oauth_application": "oauth_application", + } + + # Test if private activity cannot be retrieved + self._test_private_model( + query_name="activity", + variables={"id": (self.private_activity.id, "ID")} + ) + + # Test if private fields on public activities cannot be retrieved + for field_name, field_spec in fields.items(): + self._test_public_model_and_private_field( + query_name="activity", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_activity.id, "ID")} + ) diff --git a/amelie/settings/generic.py b/amelie/settings/generic.py index 3ac8c4f..c6076d0 100644 --- a/amelie/settings/generic.py +++ b/amelie/settings/generic.py @@ -393,7 +393,8 @@ 'graphql_jwt.middleware.JSONWebTokenMiddleware', 'graphene_django_extras.ExtraGraphQLDirectiveMiddleware', ], - 'RELAY_CONNECTION_MAX_LIMIT': 100 + 'RELAY_CONNECTION_MAX_LIMIT': 100, + 'TESTING_ENDPOINT': '/graphql/' } GRAPHENE_DEFAULT_LIMIT = 10 diff --git a/amelie/tools/tests.py b/amelie/tools/tests.py index 4bd95a3..5b01ea1 100644 --- a/amelie/tools/tests.py +++ b/amelie/tools/tests.py @@ -2,8 +2,10 @@ import datetime import json +import random from django.contrib.auth.models import User +from django.contrib.contenttypes.models import ContentType from django.core.serializers.json import DjangoJSONEncoder from django.urls import reverse from django.test import Client, testcases @@ -11,11 +13,63 @@ from django.utils import timezone from oauth2_provider.models import Application, AccessToken +from amelie.activities.models import Restaurant, ActivityLabel, Activity, EnrollmentoptionQuestion, \ + EnrollmentoptionCheckbox, EnrollmentoptionFood from amelie.members.models import Person, Committee, Preference, PreferenceCategory, Membership, MembershipType, Function from amelie.tools.logic import current_association_year from amelie.tools.models import Profile + +def generate_activities(count): + """ + Generate activities. + + Half of the activities is private. + + :param int count: Number of activities to generate. + """ + + now = timezone.now() + committee = Committee.objects.all()[0] + + restaurant = Restaurant(name='Test Restaurant') + restaurant.save() + restaurant.dish_set.create(name='Dish 1', price=33.42) + restaurant.dish_set.create(name='Dish 2', price=13.37) + label = ActivityLabel.objects.create( + name_en="Test EN", name_nl="Test NL", color="000000", icon="-", + explanation_en="-", explanation_nl="-" + ) + + for i in range(0, count): + public = bool(i % 2) + + start = now + datetime.timedelta(days=i, seconds=random.uniform(0, 5*3600)) + end = start + datetime.timedelta(seconds=random.uniform(3600, 10*3600)) + + activity = Activity(begin=start, end=end, summary_nl='Test Activity %i' % i, + summary_en='Test event %i' % i, + organizer=committee, public=public, activity_label=label) + activity.save() + + ct_question = ContentType.objects.get_for_model(EnrollmentoptionQuestion) + ct_checkbox = ContentType.objects.get_for_model(EnrollmentoptionCheckbox) + ct_food = ContentType.objects.get_for_model(EnrollmentoptionFood) + + EnrollmentoptionQuestion(activity=activity, title='Optional question %i' % i, content_type=ct_question, + required=False).save() + EnrollmentoptionQuestion(activity=activity, title='Mandatory question %i' % i, content_type=ct_question, + required=True).save() + EnrollmentoptionCheckbox(activity=activity, title='Free checkbox %i' % i, content_type=ct_checkbox).save() + EnrollmentoptionCheckbox(activity=activity, title='Paid checkbox %i' % i, content_type=ct_checkbox, + price_extra=42.33).save() + EnrollmentoptionFood(activity=activity, title='Voluntary food %i' % i, content_type=ct_food, + restaurant=restaurant, required=False).save() + EnrollmentoptionFood(activity=activity, title='Mandatory food %i' % i, content_type=ct_food, + restaurant=restaurant, required=False).save() + + class SimpleTestCase(testcases.SimpleTestCase): # Use long messages on failure longMessage = True From d90e2aaa68b5f7c6664bbdad4fd1be53c7f98a66 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 14 Oct 2024 23:31:22 +0200 Subject: [PATCH 23/29] graphql: Add more tests for activities, add tests for companyEvents --- amelie/activities/graphql.py | 18 +- amelie/calendar/graphql.py | 4 +- amelie/companies/graphql.py | 30 ++- .../graphql/{tests.py => tests/__init__.py} | 116 +++++++--- amelie/graphql/tests/test_activities.py | 176 ++++++++++++++++ amelie/graphql/tests/test_companies.py | 199 ++++++++++++++++++ amelie/settings/local.py.default | 3 +- amelie/settings/local.py.localdev | 3 +- 8 files changed, 497 insertions(+), 52 deletions(-) rename amelie/graphql/{tests.py => tests/__init__.py} (57%) create mode 100644 amelie/graphql/tests/test_activities.py create mode 100644 amelie/graphql/tests/test_companies.py diff --git a/amelie/activities/graphql.py b/amelie/activities/graphql.py index 9a4d394..8c10f95 100644 --- a/amelie/activities/graphql.py +++ b/amelie/activities/graphql.py @@ -12,7 +12,6 @@ class ActivityFilterSet(FilterSet): class Meta: model = Activity fields = { - 'id': ("exact", ), 'summary_nl': ("icontains", "iexact"), 'summary_en': ("icontains", "iexact"), 'begin': ("gt", "lt", "exact"), @@ -56,7 +55,7 @@ class Meta: def resolve_photos(self: Activity, info): # `info.context` is the Django Request object in Graphene - return self.photos.filter_public(info.context).all() + return self.photos.filter_public(info.context) def resolve_absolute_url(self: Activity, info): return self.get_absolute_url() @@ -109,16 +108,19 @@ class Meta: class ActivitiesQuery(graphene.ObjectType): - activities = DjangoPaginationConnectionField(ActivityType, organizer=graphene.ID()) + activities = DjangoPaginationConnectionField(ActivityType, id=graphene.ID(), organizer=graphene.ID()) activity = graphene.Field(ActivityType, id=graphene.ID()) - def resolve_activities(self, info, organizer=None, *args, **kwargs): - if organizer: - return Activity.objects.filter_public(info.context).filter(organizer__pk=organizer) - return Activity.objects.filter_public(info.context) + def resolve_activities(self, info, id=None, organizer=None, *args, **kwargs): + qs = Activity.objects.filter_public(info.context) + if organizer is not None: + qs = qs.filter(organizer__pk=organizer) + if id is not None: + qs = qs.filter(id=id) + return qs def resolve_activity(self, info, id, *args, **kwargs): - if id: + if id is not None: return Activity.objects.filter_public(info.context).get(pk=id) return None diff --git a/amelie/calendar/graphql.py b/amelie/calendar/graphql.py index 149e627..a5125e2 100644 --- a/amelie/calendar/graphql.py +++ b/amelie/calendar/graphql.py @@ -23,8 +23,6 @@ "location", "public", "dutch_activity", - "organizer", - "participation", ] @@ -50,7 +48,7 @@ class Meta: def resolve_attachments(self: Event, info): # `info.context` is the Django Request object in Graphene - return self.attachments.filter_public(info.context).values_list('id', flat=True) + return self.attachments.filter_public(info.context) def resolve_summary(self: Event, info): return self.summary diff --git a/amelie/companies/graphql.py b/amelie/companies/graphql.py index c0075b4..5241b5f 100644 --- a/amelie/companies/graphql.py +++ b/amelie/companies/graphql.py @@ -1,8 +1,10 @@ -from django.utils.translation import gettext_lazy as _ import graphene from django_filters import FilterSet from graphene_django import DjangoObjectType +from django.utils import timezone +from django.utils.translation import gettext_lazy as _ + from amelie.activities.graphql import ActivityLabelType from amelie.calendar.graphql import EventType, EVENT_TYPE_BASE_FIELDS from amelie.companies.models import Company, WebsiteBanner, TelevisionBanner, VivatBanner, CompanyEvent @@ -30,7 +32,6 @@ class CompanyEventFilterSet(FilterSet): class Meta: model = CompanyEvent fields = { - 'id': ("exact", ), 'summary_nl': ("icontains", "iexact"), 'summary_en': ("icontains", "iexact"), 'begin': ("gt", "lt", "exact"), @@ -46,9 +47,7 @@ class Meta: fields = [ "company", "company_text", - "company_url", - "visible_from", - "visible_till" + "company_url" ] + EVENT_TYPE_BASE_FIELDS filterset_class = CompanyEventFilterSet @@ -108,7 +107,7 @@ class CompaniesQuery(graphene.ObjectType): companies = DjangoPaginationConnectionField(CompanyType) company_event = graphene.Field(CompanyEventType, id=graphene.ID()) - company_events = DjangoPaginationConnectionField(CompanyEventType) + company_events = DjangoPaginationConnectionField(CompanyEventType, id=graphene.ID()) website_banner = graphene.Field(WebsiteBannerType, id=graphene.ID(), slug=graphene.String()) website_banners = DjangoPaginationConnectionField(WebsiteBannerType) @@ -127,10 +126,27 @@ def resolve_company(self, info, id=None, slug=None): return None def resolve_company_event(self, info, id=None): + now = timezone.now() + qs = CompanyEvent.objects.filter_public(info.context) + # If the user is not board, filter only visible activities + if not (hasattr(info.context, 'user') and info.context.user.is_authenticated and info.context.is_board): + qs = qs.filter(visible_from__lt=now, visible_till__gt=now) + if id is not None: - return CompanyEvent.objects.get(pk=id) + return qs.get(pk=id) return None + def resolve_company_events(self, info, id=None, *args, **kwargs): + now = timezone.now() + qs = CompanyEvent.objects.filter_public(info.context) + # If the user is not board, filter only visible activities + if not (hasattr(info.context, 'user') and info.context.user.is_authenticated and info.context.is_board): + qs = qs.filter(visible_from__lt=now, visible_till__gt=now) + + if id is not None: + qs = qs.filter(pk=id) + return qs + def resolve_website_banner(self, info, id=None, slug=None): if id is not None: return WebsiteBanner.objects.get(pk=id) diff --git a/amelie/graphql/tests.py b/amelie/graphql/tests/__init__.py similarity index 57% rename from amelie/graphql/tests.py rename to amelie/graphql/tests/__init__.py index 92ab6e4..9a84a29 100644 --- a/amelie/graphql/tests.py +++ b/amelie/graphql/tests/__init__.py @@ -2,25 +2,36 @@ import re from typing import Optional, Dict, Tuple +from django.test import Client from graphene_django.utils.testing import GraphQLTestMixin -from amelie.activities.models import Activity -from amelie.tools.tests import TestCase, generate_activities +from amelie.tools.tests import TestCase -class GraphQLPrivateFieldTests(GraphQLTestMixin, TestCase): +class GraphQLClient(Client): + """ + Django Test Client with secure=True set for the POST request, to make sure test requests are made + to the secure port. This is needed because in our settings the SECURE_SSL_REDIRECT setting is set to True. + """ + def post(self, *args, **kwargs): + kwargs['secure'] = True + return super().post(*args, **kwargs) + + +class BaseGraphQLPrivateFieldTests(GraphQLTestMixin, TestCase): MODEL_ERROR_REGEX = re.compile(r".* matching query does not exist\.") - FIELD_ERROR_REGEX = re.compile(r"Cannot query field .*") + FIELD_ERROR_REGEX = re.compile(r"Cannot query field '.*' on type '.*'\.") def setUp(self): - super(GraphQLPrivateFieldTests, self).setUp() + super(BaseGraphQLPrivateFieldTests, self).setUp() + self.client = GraphQLClient() + + # Generate basic data self.load_basic_data() - generate_activities(2) - self.public_activity = Activity.objects.filter(public=True).order_by('-id').first() - self.private_activity = Activity.objects.filter(public=False).order_by('-id').first() def _test_private_model(self, query_name: str, public_field_spec: str = "id", - variables: Optional[Dict[str, Tuple[str, str]]] = None): + variables: Optional[Dict[str, Tuple[str, str]]] = None, + error_regex: Optional[re.Pattern] = None): """ Test if a model instance that should be private is actually not accessible via GraphQL. @@ -37,7 +48,14 @@ def _test_private_model(self, query_name: str, public_field_spec: str = "id", For example to select an activity by ID: {'id': (1, 'ID')} Or a committee by its slug: {'slug': ('www', 'String')} :type variables: Optional[Dict[str, Tuple[str, str]]] + + :param error_regex: A regular expression pattern to match expected query errors to. + :type error_regex: re.Pattern """ + # Use default pattern if not given + if error_regex is None: + error_regex = BaseGraphQLPrivateFieldTests.MODEL_ERROR_REGEX + params = ", ".join(f"{k}: ${k}" for k in variables.keys()) if variables else "" param_types = ", ".join(f"${k}: {v[1]}" for k, v in variables.items()) if variables else "" param_types = f"({param_types})" if param_types else "" @@ -51,8 +69,6 @@ def _test_private_model(self, query_name: str, public_field_spec: str = "id", ''' response = self.query(query, variables=query_variables) - print(query, query_variables) - self.assertResponseHasErrors( response, f"Query for '{query_name}', private object '{query_variables}' does not return an error!" @@ -63,11 +79,65 @@ def _test_private_model(self, query_name: str, public_field_spec: str = "id", for error in content['errors']: # If different error than expected, throw error. self.assertRegex( - error['message'], GraphQLPrivateFieldTests.MODEL_ERROR_REGEX, + error['message'], error_regex, f"Query for '{query_name}', private object '{query_variables}' raised a different error than expected!\n" f"{error['message']}" ) + def _test_private_model_list(self, query_name: str, public_field_spec: str = "id", + variables: Optional[Dict[str, Tuple[str, str]]] = None, + error_regex: Optional[re.Pattern] = None): + """ + Test if a model instance that should be private is not in the list returned by a GraphQL query. + + :param query_name: The GraphQL query name to test. I.E. activity in `query{activity(id: 1){ ... }}` + :type query_name: str + + :param public_field_spec: Specification of a public field that is queryable on public instances of the model. + This can be a simple name of a field, or a field in some nested object. + For example for activity: "id" or "photos { created }" + :type public_field_spec: str + + :param variables: A dictionary of variables used in the GraphQL query to select the instance. + Key is the variable name, value is a tuple with the value, and the GraphQL type of the var. + For example to select an activity by ID: {'id': (1, 'ID')} + Or a committee by its slug: {'slug': ('www', 'String')} + :type variables: Optional[Dict[str, Tuple[str, str]]] + + :param error_regex: A regular expression pattern to match expected query errors to. + :type error_regex: re.Pattern + """ + # Use default pattern if not given + if error_regex is None: + error_regex = BaseGraphQLPrivateFieldTests.MODEL_ERROR_REGEX + + params = ", ".join(f"{k}: ${k}" for k in variables.keys()) if variables else "" + param_types = ", ".join(f"${k}: {v[1]}" for k, v in variables.items()) if variables else "" + param_types = f"({param_types})" if param_types else "" + query_variables = {x: v[0] for x, v in variables.items()} + query = f''' + query {param_types} {{ + {query_name}({params}) {{ + {public_field_spec} + }} + }} + ''' + response = self.query(query, variables=query_variables) + + # Request should succeed + self.assertResponseNoErrors( + response, + f"Query for '{query_name}', private object '{query_variables}' should succeed but returned an error!" + ) + + # Check if the results list is empty. + content = json.loads(response.content) + num_obj = len(content['data'][query_name]['results']) + self.assertEqual( + content['data'][query_name]['results'], [], + f"Query for '{query_name}', private object '{query_variables}' did not return 0 expected objects (returned {num_obj})!" + ) + def _test_public_model_and_private_field(self, query_name: str, field_name: str, field_spec: str, variables: Optional[Dict[str, Tuple[str, str]]] = None): """ @@ -102,6 +172,7 @@ def _test_public_model_and_private_field(self, query_name: str, field_name: str, }} ''' response = self.query(query, variables=query_variables) + self.assertResponseHasErrors( response, f"Query for '{query_name}', private field spec '{field_name}' does not return an error!" @@ -112,26 +183,7 @@ def _test_public_model_and_private_field(self, query_name: str, field_name: str, for error in content['errors']: # If different error than expected, throw error. self.assertRegex( - error['message'], GraphQLPrivateFieldTests.FIELD_ERROR_REGEX, + error['message'], BaseGraphQLPrivateFieldTests.FIELD_ERROR_REGEX, f"Query for '{query_name}', private field spec '{field_name}' raised a different error than expected!\n" f"{error['message']}" ) - - def test_activity_private_fields(self): - fields: Dict[str, str] = { - "facebook_event_id": "facebook_event_id", - "oauth_application": "oauth_application", - } - - # Test if private activity cannot be retrieved - self._test_private_model( - query_name="activity", - variables={"id": (self.private_activity.id, "ID")} - ) - - # Test if private fields on public activities cannot be retrieved - for field_name, field_spec in fields.items(): - self._test_public_model_and_private_field( - query_name="activity", field_name=field_name, field_spec=field_spec, - variables={"id": (self.public_activity.id, "ID")} - ) diff --git a/amelie/graphql/tests/test_activities.py b/amelie/graphql/tests/test_activities.py new file mode 100644 index 0000000..695043c --- /dev/null +++ b/amelie/graphql/tests/test_activities.py @@ -0,0 +1,176 @@ +import json +from typing import Dict + +from django.core.files.uploadedfile import SimpleUploadedFile + +from amelie.activities.models import Activity +from amelie.files.models import Attachment +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests +from amelie.tools.tests import generate_activities + + +class ActivitiesGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Activities app + """ + + def setUp(self): + super(ActivitiesGraphQLPrivateFieldTests, self).setUp() + + # Generate two activities, one public and one private + generate_activities(2) + + # Retrieve those activities + self.public_activity = Activity.objects.filter(public=True).order_by('-id').first() + self.private_activity = Activity.objects.filter(public=False).order_by('-id').first() + + # Add a private and public photo and attachment to the public activity + self.public_attachment = Attachment( + public=True, file=SimpleUploadedFile("public.txt", b"File Contents") + ) + self.public_attachment.save(create_thumbnails=False) + self.private_attachment = Attachment( + public=False, file=SimpleUploadedFile("private.txt", b"Secret Contents") + ) + self.private_attachment.save(create_thumbnails=False) + self.public_activity.attachments.add(self.public_attachment) + self.public_activity.attachments.add(self.private_attachment) + self.public_activity.photos.add(self.public_attachment) + self.public_activity.photos.add(self.private_attachment) + + + ACTIVITY_PRIVATE_FIELDS: Dict[str, str] = { + "facebook_event_id": "facebookEventId", + "oauth_application": "oauthApplication", + "participants": "participants", + "callback_url": "callbackUrl", + "callback_secret_key": "callbackSecretKey", + "update_count": "updateCount", + + # organizer private subfields + "organizer.abbreviation": "organizer { abbreviation }", + "organizer.private_email": "organizer { privateEmail }", + "organizer.superuser": "organizer { superuser }", + "organizer.gitlab": "organizer { gitlab }", + "organizer.ledger_account_number": "organizer { ledgerAccountNumber }", + + # organizer.function_set private subfields + "organizer.function_set.note": "organizer { functionSet { note }}", + } + + def test_activity_private_model(self): + # Test if private activity cannot be retrieved + self._test_private_model( + query_name="activity", + variables={"id": (self.private_activity.id, "ID")} + ) + + def test_activities_private_model(self): + # Test if private activity cannot be retrieved via list view + self._test_private_model_list( + query_name="activities", + public_field_spec="results { id }", + variables={"id": (self.private_activity.id, "ID")} + ) + + def test_activity_private_fields(self): + # Test if private fields on public activities cannot be retrieved + for field_name, field_spec in self.ACTIVITY_PRIVATE_FIELDS.items(): + self._test_public_model_and_private_field( + query_name="activity", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_activity.id, "ID")}, + ) + + def test_activities_private_fields(self): + # Test if private fields on public activities cannot be retrieved via list view + for field_name, field_spec in self.ACTIVITY_PRIVATE_FIELDS.items(): + # Wrap the field spec in "results { }" for list view + field_spec = f"results {{ {field_spec} }}" + self._test_public_model_and_private_field( + query_name="activity", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_activity.id, "ID")} + ) + + def test_activity_private_attachment(self): + # Test if private activity attachments are hidden in get view + query = "query ($id: ID) { activity(id: $id) { attachments { public }}}" + response = self.query(query, variables={"id": self.public_activity.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'activity', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['activity']['attachments']), + f"Query for 'activity', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['activity']['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'activity', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_activities_private_attachment(self): + # Test if private activity attachments are hidden in list view + query = "query ($id: ID) { activities(id: $id) { results { attachments { public }}}}" + response = self.query(query, variables={"id": self.public_activity.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'activities', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['activities']['results'][0]['attachments']), + f"Query for 'activities', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['activities']['results'][0]['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'activities', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_activity_private_photo(self): + # Test if private activity photos are hidden in get view + query = "query ($id: ID) { activity(id: $id) { photos { public }}}" + response = self.query(query, variables={"id": self.public_activity.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'activity', public field 'photos' returned an error!" + ) + + # Check that all photos are public, and that the correct amount of photos are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['activity']['photos']), + f"Query for 'activity', public field 'photos' returned a private photo!") + num_photos = len(content['data']['activity']['photos']) + self.assertEqual( + num_photos, 1, + f"Query for 'activity', public field 'photos' did not return 1 expected photo (returned {num_photos})!" + ) + + def test_activities_private_photo(self): + # Test if private activity photos are hidden in list view + query = "query ($id: ID) { activities(id: $id) { results { photos { public }}}}" + response = self.query(query, variables={"id": self.public_activity.id}) + content = json.loads(response.content) + + # The request should succeedte + self.assertResponseNoErrors( + response, + f"Query for 'activities', public field 'photos' returned an error!" + ) + + # Check that all photos are public, and that the correct amount of photos are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['activities']['results'][0]['photos']), + f"Query for 'activity', public field 'photos' returned a private photo!") + num_photos = len(content['data']['activities']['results'][0]['photos']) + self.assertEqual( + num_photos, 1, + f"Query for 'activities', public field 'photos' did not return 1 expected photo (returned {num_photos})!" + ) diff --git a/amelie/graphql/tests/test_companies.py b/amelie/graphql/tests/test_companies.py new file mode 100644 index 0000000..b3189e6 --- /dev/null +++ b/amelie/graphql/tests/test_companies.py @@ -0,0 +1,199 @@ +import json +import datetime +import random +from typing import Dict + +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.companies.models import Company, CompanyEvent, WebsiteBanner, VivatBanner, TelevisionBanner +from amelie.files.models import Attachment +from amelie.members.models import Committee +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests + + +def generate_company_events(): + """ + Generate Company Events for testing. + + It will generate 4 events: + - A public event that is visible + - A public event that is not visible + - A private event that is visible + - A private event that is not visible + """ + + now = timezone.now() + committee = Committee.objects.all()[0] + start = now - datetime.timedelta(days=10) + end = start + datetime.timedelta(days=20) + company = Company.objects.create( + name_nl="Bedrijf", name_en="Company", url="https://inter-actief.net", + profile_nl="Een bedrijf", profile_en="A company", start_date=start, end_date=end + ) + + i = 0 + for public in [True, False]: + for visible in [True, False]: + i += 1 + start = now + datetime.timedelta(days=i, seconds=random.uniform(0, 5*3600)) + end = start + datetime.timedelta(seconds=random.uniform(3600, 10*3600)) + + if visible: + visible_from = now - datetime.timedelta(days=5) + visible_till = now + datetime.timedelta(days=5) + else: + visible_from = now - datetime.timedelta(days=15) + visible_till = now - datetime.timedelta(days=5) + + event = CompanyEvent( + begin=start, end=end, summary_nl='Test Event %i' % i, + summary_en='Test event %i' % i, + organizer=committee, public=public, company=company, + visible_from=visible_from, visible_till=visible_till + ) + event.save() + + +class CompaniesGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Companies app + """ + + def setUp(self): + super(CompaniesGraphQLPrivateFieldTests, self).setUp() + + # Generate company events + generate_company_events() + + # Retrieve those events + now = timezone.now() + self.public_visible_event = CompanyEvent.objects.filter(public=True, visible_from__lt=now, visible_till__gt=now).order_by('-id').first() + self.public_invisible_event = CompanyEvent.objects.filter(public=True, visible_till__lt=now).order_by('-id').first() + self.private_visible_event = CompanyEvent.objects.filter(public=False, visible_from__lt=now, visible_till__gt=now).order_by('-id').first() + self.private_invisible_event = CompanyEvent.objects.filter(public=False, visible_till__lt=now).order_by('-id').first() + + # Add a private and public attachment to the public visible event + self.public_attachment = Attachment( + public=True, file=SimpleUploadedFile("public.txt", b"File Contents") + ) + self.public_attachment.save(create_thumbnails=False) + self.private_attachment = Attachment( + public=False, file=SimpleUploadedFile("private.txt", b"Secret Contents") + ) + self.private_attachment.save(create_thumbnails=False) + + self.public_visible_event.attachments.add(self.public_attachment) + self.public_visible_event.attachments.add(self.private_attachment) + + + COMPANY_EVENT_PRIVATE_FIELDS: Dict[str, str] = { + "visible_from": "visibleFrom", + "visible_till": "visibleTill", + "callback_url": "callbackUrl", + "callback_secret_key": "callbackSecretKey", + "update_count": "updateCount", + + # organizer private subfields + "organizer.abbreviation": "organizer { abbreviation }", + "organizer.private_email": "organizer { privateEmail }", + "organizer.superuser": "organizer { superuser }", + "organizer.gitlab": "organizer { gitlab }", + "organizer.ledger_account_number": "organizer { ledgerAccountNumber }", + + # organizer.function_set private subfields + "organizer.function_set.note": "organizer { functionSet { note }}", + } + + def test_company_event_private_model(self): + # Test if public, but invisible, and private events cannot be retrieved + self._test_private_model( + query_name="companyEvent", + variables={"id": (self.public_invisible_event.id, "ID")} + ) + self._test_private_model( + query_name="companyEvent", + variables={"id": (self.private_visible_event.id, "ID")} + ) + self._test_private_model( + query_name="companyEvent", + variables={"id": (self.private_invisible_event.id, "ID")} + ) + + def test_company_events_private_model(self): + # Test if public, but invisible, and private events cannot be retrieved via list view + self._test_private_model_list( + query_name="companyEvents", + public_field_spec="results { id }", + variables={"id": (self.public_invisible_event.id, "ID")} + ) + self._test_private_model_list( + query_name="companyEvents", + public_field_spec="results { id }", + variables={"id": (self.private_visible_event.id, "ID")} + ) + self._test_private_model_list( + query_name="companyEvents", + public_field_spec="results { id }", + variables={"id": (self.private_invisible_event.id, "ID")} + ) + + def test_company_event_private_fields(self): + # Test if private fields on public events cannot be retrieved + for field_name, field_spec in self.COMPANY_EVENT_PRIVATE_FIELDS.items(): + self._test_public_model_and_private_field( + query_name="companyEvent", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_visible_event.id, "ID")}, + ) + + def test_company_events_private_fields(self): + # Test if private fields on public events cannot be retrieved via list view + for field_name, field_spec in self.COMPANY_EVENT_PRIVATE_FIELDS.items(): + # Wrap the field spec in "results { }" for list view + field_spec = f"results {{ {field_spec} }}" + self._test_public_model_and_private_field( + query_name="companyEvents", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_visible_event.id, "ID")} + ) + + def test_company_event_private_attachment(self): + # Test if private event attachments are hidden in get view + query = "query ($id: ID) { companyEvent(id: $id) { attachments { public }}}" + response = self.query(query, variables={"id": self.public_visible_event.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'companyEvent', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['companyEvent']['attachments']), + f"Query for 'companyEvent', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['companyEvent']['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'companyEvent', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_company_events_private_attachment(self): + # Test if private event attachments are hidden in list view + query = "query ($id: ID) { companyEvents(id: $id) { results { attachments { public }}}}" + response = self.query(query, variables={"id": self.public_visible_event.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'companyEvents', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['companyEvents']['results'][0]['attachments']), + f"Query for 'companyEvents', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['companyEvents']['results'][0]['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'companyEvents', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) diff --git a/amelie/settings/local.py.default b/amelie/settings/local.py.default index 72198fa..c2d82b6 100644 --- a/amelie/settings/local.py.default +++ b/amelie/settings/local.py.default @@ -4,6 +4,7 @@ # Keep these imports here! import warnings import os +import sys from amelie.settings.generic import * @@ -30,7 +31,7 @@ DATABASES = { # Definitely DON'T put these settings in production! ENV = 'DEBUG' DEBUG = True -DEBUG_TOOLBAR = True +DEBUG_TOOLBAR = True and "test" not in sys.argv ALLOWED_HOSTS = ["*"] # Default setting for enabling profiling (the rest of the config is done in local.py(.default) diff --git a/amelie/settings/local.py.localdev b/amelie/settings/local.py.localdev index 85c3638..a6c9673 100644 --- a/amelie/settings/local.py.localdev +++ b/amelie/settings/local.py.localdev @@ -4,6 +4,7 @@ # Keep these imports here! import warnings import os +import sys from amelie.settings.generic import * @@ -22,7 +23,7 @@ DATABASES = { # Definitely DON'T put these settings in production! ENV = 'DEBUG' DEBUG = True -DEBUG_TOOLBAR = True +DEBUG_TOOLBAR = True and "test" not in sys.argv ALLOWED_HOSTS = ["*"] # Disable secure redirects to allow local development without SSL From 3494332f3235fcee88f4e2c0e7de7d13ccfa04db Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 28 Oct 2024 11:45:21 +0100 Subject: [PATCH 24/29] graphql: Add tests for education and files modules --- amelie/education/graphql.py | 21 ++-- amelie/graphql/tests/__init__.py | 4 +- amelie/graphql/tests/test_education.py | 162 +++++++++++++++++++++++++ amelie/graphql/tests/test_files.py | 28 +++++ 4 files changed, 204 insertions(+), 11 deletions(-) create mode 100644 amelie/graphql/tests/test_education.py create mode 100644 amelie/graphql/tests/test_files.py diff --git a/amelie/education/graphql.py b/amelie/education/graphql.py index a9282c2..faf60de 100644 --- a/amelie/education/graphql.py +++ b/amelie/education/graphql.py @@ -5,12 +5,7 @@ from django.utils.translation import gettext_lazy as _ from graphene_django.forms.mutation import DjangoFormMutation -from amelie import settings from amelie.education.forms import EducationalBouquetForm -from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField - -from amelie.education.models import Category, Page -from amelie.iamailer import MailTask, Recipient from amelie.activities.graphql import ActivityLabelType from amelie.calendar.graphql import EventType, EVENT_TYPE_BASE_FIELDS @@ -65,7 +60,6 @@ class EducationEventFilterSet(FilterSet): class Meta: model = EducationEvent fields = { - 'id': ("exact",), 'summary_nl': ("icontains", "iexact"), 'summary_en': ("icontains", "iexact"), 'begin': ("gt", "lt", "exact"), @@ -98,6 +92,7 @@ def resolve_activity_type(self: EducationEvent, info): def resolve_absolute_url(self: EducationEvent, info): return self.get_absolute_url() + class EducationQuery(graphene.ObjectType): educationpage_category = graphene.Field(EducationPageCategoryType, id=graphene.ID()) educationpage_categories = DjangoPaginationConnectionField(EducationPageCategoryType) @@ -106,7 +101,7 @@ class EducationQuery(graphene.ObjectType): educationpages = DjangoPaginationConnectionField(EducationPageType) education_event = graphene.Field(EducationEventType, id=graphene.ID()) - education_events = DjangoPaginationConnectionField(EducationEventType) + education_events = DjangoPaginationConnectionField(EducationEventType, id=graphene.ID()) def resolve_educationpage_category(root, info, id=None): """Find education page category by ID""" @@ -122,12 +117,20 @@ def resolve_educationpage(root, info, id=None, slug=None): return Page.objects.get(slug=slug) return None - def resolve_education_event(self, id=None): + def resolve_education_event(self, info, id=None): """Find education event by ID""" + qs = EducationEvent.objects.filter_public(info.context) if id is not None: - return EducationEvent.objects.get(pk=id) + return qs.get(pk=id) return None + def resolve_education_events(self, info, id=None, *args, **kwargs): + """Find education event by ID""" + qs = EducationEvent.objects.filter_public(info.context) + if id is not None: + return qs.filter(pk=id) + return qs + class EducationalBouquetMutation(DjangoFormMutation): diff --git a/amelie/graphql/tests/__init__.py b/amelie/graphql/tests/__init__.py index 9a84a29..bdbd20c 100644 --- a/amelie/graphql/tests/__init__.py +++ b/amelie/graphql/tests/__init__.py @@ -1,6 +1,6 @@ import json import re -from typing import Optional, Dict, Tuple +from typing import Optional, Dict, Tuple, Union from django.test import Client from graphene_django.utils.testing import GraphQLTestMixin @@ -30,7 +30,7 @@ def setUp(self): self.load_basic_data() def _test_private_model(self, query_name: str, public_field_spec: str = "id", - variables: Optional[Dict[str, Tuple[str, str]]] = None, + variables: Optional[Dict[str, Tuple[Union[str, int], str]]] = None, error_regex: Optional[re.Pattern] = None): """ Test if a model instance that should be private is actually not accessible via GraphQL. diff --git a/amelie/graphql/tests/test_education.py b/amelie/graphql/tests/test_education.py new file mode 100644 index 0000000..54db68c --- /dev/null +++ b/amelie/graphql/tests/test_education.py @@ -0,0 +1,162 @@ +import json +import datetime +import random +from typing import Dict + +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.education.models import EducationEvent +from amelie.files.models import Attachment +from amelie.members.models import Committee +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests + + +def generate_education_events(): + """ + Generate Education Events for testing. + + It will generate 4 events: + - A public event that is visible + - A public event that is not visible + - A private event that is visible + - A private event that is not visible + """ + + now = timezone.now() + committee = Committee.objects.all()[0] + + i = 0 + for public in [True, False]: + i += 1 + start = now + datetime.timedelta(days=i, seconds=random.uniform(0, 5*3600)) + end = start + datetime.timedelta(seconds=random.uniform(3600, 10*3600)) + + event = EducationEvent( + begin=start, end=end, summary_nl='Test Event %i' % i, + summary_en='Test event %i' % i, + organizer=committee, public=public, + education_organizer="Education organizer" + ) + event.save() + + +class EducationGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Education app + """ + + def setUp(self): + super(EducationGraphQLPrivateFieldTests, self).setUp() + + # Generate education events + generate_education_events() + + # Retrieve those events + self.public_event = EducationEvent.objects.filter(public=True).order_by('-id').first() + self.private_event = EducationEvent.objects.filter(public=False).order_by('-id').first() + + # Add a private and public attachment to the public visible event + self.public_attachment = Attachment( + public=True, file=SimpleUploadedFile("public.txt", b"File Contents") + ) + self.public_attachment.save(create_thumbnails=False) + self.private_attachment = Attachment( + public=False, file=SimpleUploadedFile("private.txt", b"Secret Contents") + ) + self.private_attachment.save(create_thumbnails=False) + + self.public_event.attachments.add(self.public_attachment) + self.public_event.attachments.add(self.private_attachment) + + + EDUCATION_EVENT_PRIVATE_FIELDS: Dict[str, str] = { + "callback_url": "callbackUrl", + "callback_secret_key": "callbackSecretKey", + "update_count": "updateCount", + + # organizer private subfields + "organizer.abbreviation": "organizer { abbreviation }", + "organizer.private_email": "organizer { privateEmail }", + "organizer.superuser": "organizer { superuser }", + "organizer.gitlab": "organizer { gitlab }", + "organizer.ledger_account_number": "organizer { ledgerAccountNumber }", + + # organizer.function_set private subfields + "organizer.function_set.note": "organizer { functionSet { note }}", + } + + def test_education_event_private_model(self): + # Test if private events cannot be retrieved + self._test_private_model( + query_name="educationEvent", + variables={"id": (self.private_event.id, "ID")} + ) + + def test_education_events_private_model(self): + # Test if private events cannot be retrieved via list view + self._test_private_model_list( + query_name="educationEvents", + public_field_spec="results { id }", + variables={"id": (self.private_event.id, "ID")} + ) + + def test_education_event_private_fields(self): + # Test if private fields on public events cannot be retrieved + for field_name, field_spec in self.EDUCATION_EVENT_PRIVATE_FIELDS.items(): + self._test_public_model_and_private_field( + query_name="educationEvent", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_event.id, "ID")}, + ) + + def test_education_events_private_fields(self): + # Test if private fields on public events cannot be retrieved via list view + for field_name, field_spec in self.EDUCATION_EVENT_PRIVATE_FIELDS.items(): + # Wrap the field spec in "results { }" for list view + field_spec = f"results {{ {field_spec} }}" + self._test_public_model_and_private_field( + query_name="educationEvents", field_name=field_name, field_spec=field_spec, + variables={"id": (self.public_event.id, "ID")} + ) + + def test_education_event_private_attachment(self): + # Test if private event attachments are hidden in get view + query = "query ($id: ID) { educationEvent(id: $id) { attachments { public }}}" + response = self.query(query, variables={"id": self.public_event.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'educationEvent', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['educationEvent']['attachments']), + f"Query for 'educationEvent', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['educationEvent']['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'educationEvent', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_education_events_private_attachment(self): + # Test if private event attachments are hidden in list view + query = "query ($id: ID) { educationEvents(id: $id) { results { attachments { public }}}}" + response = self.query(query, variables={"id": self.public_event.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'educationEvents', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['educationEvents']['results'][0]['attachments']), + f"Query for 'educationEvents', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['educationEvents']['results'][0]['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'educationEvents', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) diff --git a/amelie/graphql/tests/test_files.py b/amelie/graphql/tests/test_files.py new file mode 100644 index 0000000..c2a451b --- /dev/null +++ b/amelie/graphql/tests/test_files.py @@ -0,0 +1,28 @@ +from django.core.files.uploadedfile import SimpleUploadedFile + +from amelie.files.models import Attachment +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests + + +class FilesGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Files app + """ + + def setUp(self): + super(FilesGraphQLPrivateFieldTests, self).setUp() + + # Create a private attachment + self.private_attachment = Attachment( + public=False, file=SimpleUploadedFile("private.txt", b"Secret Contents") + ) + self.private_attachment.save(create_thumbnails=False) + + + def test_attachment_private_model(self): + # Test if private attachment cannot be retrieved + self._test_private_model( + query_name="attachment", + public_field_spec="public", + variables={"id": (self.private_attachment.id, "ID")} + ) From 70bf3296d8ecdaeb5d2c4c83d7195bdc5287c201 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Fri, 1 Nov 2024 15:15:56 +0100 Subject: [PATCH 25/29] graphql: Add tests for members module, update tests for activities, education and companies --- amelie/graphql/tests/__init__.py | 1 + amelie/graphql/tests/test_activities.py | 3 + amelie/graphql/tests/test_companies.py | 3 + amelie/graphql/tests/test_education.py | 3 + amelie/graphql/tests/test_members.py | 201 ++++++++++++++++++++++++ amelie/members/graphql.py | 29 +++- 6 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 amelie/graphql/tests/test_members.py diff --git a/amelie/graphql/tests/__init__.py b/amelie/graphql/tests/__init__.py index bdbd20c..0c1e98a 100644 --- a/amelie/graphql/tests/__init__.py +++ b/amelie/graphql/tests/__init__.py @@ -1,4 +1,5 @@ import json +import logging import re from typing import Optional, Dict, Tuple, Union diff --git a/amelie/graphql/tests/test_activities.py b/amelie/graphql/tests/test_activities.py index 695043c..a6c8c23 100644 --- a/amelie/graphql/tests/test_activities.py +++ b/amelie/graphql/tests/test_activities.py @@ -47,6 +47,9 @@ def setUp(self): "callback_secret_key": "callbackSecretKey", "update_count": "updateCount", + # Reverse foreign keys (Event) + "participation": "participation", + # organizer private subfields "organizer.abbreviation": "organizer { abbreviation }", "organizer.private_email": "organizer { privateEmail }", diff --git a/amelie/graphql/tests/test_companies.py b/amelie/graphql/tests/test_companies.py index b3189e6..9ff56f7 100644 --- a/amelie/graphql/tests/test_companies.py +++ b/amelie/graphql/tests/test_companies.py @@ -94,6 +94,9 @@ def setUp(self): "callback_secret_key": "callbackSecretKey", "update_count": "updateCount", + # Reverse foreign keys (Event) + "participation": "participation", + # organizer private subfields "organizer.abbreviation": "organizer { abbreviation }", "organizer.private_email": "organizer { privateEmail }", diff --git a/amelie/graphql/tests/test_education.py b/amelie/graphql/tests/test_education.py index 54db68c..d687073 100644 --- a/amelie/graphql/tests/test_education.py +++ b/amelie/graphql/tests/test_education.py @@ -75,6 +75,9 @@ def setUp(self): "callback_secret_key": "callbackSecretKey", "update_count": "updateCount", + # Reverse foreign keys (Event) + "participation": "participation", + # organizer private subfields "organizer.abbreviation": "organizer { abbreviation }", "organizer.private_email": "organizer { privateEmail }", diff --git a/amelie/graphql/tests/test_members.py b/amelie/graphql/tests/test_members.py new file mode 100644 index 0000000..b817b57 --- /dev/null +++ b/amelie/graphql/tests/test_members.py @@ -0,0 +1,201 @@ +import json +import datetime +import random +from typing import Dict + +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.members.models import Committee, CommitteeCategory +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests + + +def generate_committees(): + """ + Generate Committees for testing. + + It will generate a committee category and 4 committees: + - A regular committee without parent + - A regular committee with a parent + - An abolished committee without a parent + - An abolished committee with a parent + """ + + cc = CommitteeCategory.objects.create(name="Committee Category", slug="committee-category") + + now = datetime.date.today() + last_week = now - datetime.timedelta(days=7) + + for abolished in [True, False]: + committee = Committee.objects.create( + name=f"Committee {'Abolished' if abolished else 'Regular'}", + abbreviation=f"c-{'abolished' if abolished else 'regular'}", + category=cc, + slug=f"committee-{'abolished' if abolished else 'regular'}", + email=f"committee-{'abolished' if abolished else 'regular'}@inter-actief.net", + founded=last_week, + abolished=now if abolished else None, + website="https://inter-actief.net", + information_nl="Informatie NL", + information_en="Information En", + private_email=abolished, + superuser=False, + gitlab=False, + logo=SimpleUploadedFile("logo.jpg", b"File Contents"), + group_picture=SimpleUploadedFile("group.jpg", b"File Contents"), + ledger_account_number="1111" + ) + child_committee = Committee.objects.create( + name=f"Child Committee {'Abolished' if abolished else 'Regular'}", + abbreviation=f"cc-{'abolished' if abolished else 'regular'}", + category=cc, + slug=f"child-committee-{'abolished' if abolished else 'regular'}", + email=f"childcommittee-{'abolished' if abolished else 'regular'}@inter-actief.net", + founded=last_week, + abolished=now if abolished else None, + website="https://inter-actief.net", + information_nl="Informatie NL", + information_en="Information En", + private_email=abolished, + superuser=False, + gitlab=False, + logo=SimpleUploadedFile("logo.jpg", b"File Contents"), + group_picture=SimpleUploadedFile("group.jpg", b"File Contents"), + ledger_account_number="1111" + ) + child_committee.parent_committees.add(committee) + + + +class MembersGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Members app + + Queries: + - committeeCategory + - committeeCategories + - committee + - committees + """ + + def setUp(self): + super(MembersGraphQLPrivateFieldTests, self).setUp() + + # Generate committees + generate_committees() + + # Retrieve those committees + self.category = CommitteeCategory.objects.get(slug="committee-category") + self.regular_committee = Committee.objects.get(abbreviation="c-regular") + self.abolished_committee = Committee.objects.get(abbreviation="c-abolished") + self.regular_child_committee = Committee.objects.get(abbreviation="cc-regular") + self.abolished_child_committee = Committee.objects.get(abbreviation="cc-abolished") + + + MEMBERS_COMITTEE_PRIVATE_FIELDS: Dict[str, str] = { + "abbreviation": "abbreviation", + "private_email": "privateEmail", + "superuser": "superuser", + "gitlab": "gitlab", + "ledger_account_number": "ledgerAccountNumber", + + # function_set private subfields + "function_set.note": "functionSet { note }", + + # parent_committees private subfields + "parent_committees.abbreviation": "parentCommittees { abbreviation }", + "parent_committees.private_email": "parentCommittees { privateEmail }", + "parent_committees.superuser": "parentCommittees { superuser }", + "parent_committees.gitlab": "parentCommittees { gitlab }", + "parent_committees.ledger_account_number": "parentCommittees { ledgerAccountNumber }", + "parent_committees.function_set.note": "parentCommittees { functionSet { note } }", + } + # TODO: email field if private_email is set for committee + + MEMBERS_COMITTEECATEGORY_PRIVATE_FIELDS: Dict[str, str] = { + "committee_set.": "callbackUrl", + "committee_set.abbreviation": "committeeSet { abbreviation }", + "committee_set.private_email": "committeeSet { privateEmail }", + "committee_set.superuser": "committeeSet { superuser }", + "committee_set.gitlab": "committeeSet { gitlab }", + "committee_set.ledger_account_number": "committeeSet { ledgerAccountNumber }", + + # function_set private subfields + "committee_set.function_set.note": "committeeSet { functionSet { note } }", + + # parent_committees private subfields + "committee_set.parent_committees.abbreviation": "committeeSet { parentCommittees { abbreviation } }", + "committee_set.parent_committees.private_email": "committeeSet { parentCommittees { privateEmail } }", + "committee_set.parent_committees.superuser": "committeeSet { parentCommittees { superuser } }", + "committee_set.parent_committees.gitlab": "committeeSet { parentCommittees { gitlab } }", + "committee_set.parent_committees.ledger_account_number": "committeeSet { parentCommittees { ledgerAccountNumber } }", + "committee_set.parent_committees.function_set.note": "committeeSet { parentCommittees { functionSet { note } } }", + } + + def test_committee_private_model(self): + # Test if abolished committees cannot be retrieved + self._test_private_model( + query_name="committee", + variables={"id": (self.abolished_committee.id, "ID")} + ) + self._test_private_model( + query_name="committee", + variables={"id": (self.abolished_child_committee.id, "ID")} + ) + + def test_committees_private_model(self): + # Test if abolished committees cannot be retrieved via list view + self._test_private_model_list( + query_name="committees", + public_field_spec="results { id }", + variables={"id": (self.abolished_committee.id, "ID"), "includeAbolished": (True, "Boolean!")} + ) + self._test_private_model_list( + query_name="committees", + public_field_spec="results { id }", + variables={"id": (self.abolished_child_committee.id, "ID"), "includeAbolished": (True, "Boolean!")} + ) + + def test_committee_private_fields(self): + # Test if private fields on regular committees cannot be retrieved + for field_name, field_spec in self.MEMBERS_COMITTEE_PRIVATE_FIELDS.items(): + self._test_public_model_and_private_field( + query_name="committee", field_name=field_name, field_spec=field_spec, + variables={"id": (self.regular_committee.id, "ID")}, + ) + self._test_public_model_and_private_field( + query_name="committee", field_name=field_name, field_spec=field_spec, + variables={"id": (self.regular_child_committee.id, "ID")}, + ) + + def test_committees_private_fields(self): + # Test if private fields on regular committees cannot be retrieved via list view + for field_name, field_spec in self.MEMBERS_COMITTEE_PRIVATE_FIELDS.items(): + # Wrap the field spec in "results { }" for list view + field_spec = f"results {{ {field_spec} }}" + self._test_public_model_and_private_field( + query_name="committees", field_name=field_name, field_spec=field_spec, + variables={"id": (self.regular_committee.id, "ID"), "includeAbolished": (True, "Boolean!")} + ) + self._test_public_model_and_private_field( + query_name="committees", field_name=field_name, field_spec=field_spec, + variables={"id": (self.regular_child_committee.id, "ID"), "includeAbolished": (True, "Boolean!")} + ) + + def test_committee_category_private_fields(self): + # Test if private fields on committee categories cannot be retrieved + for field_name, field_spec in self.MEMBERS_COMITTEECATEGORY_PRIVATE_FIELDS.items(): + self._test_public_model_and_private_field( + query_name="committeeCategory", field_name=field_name, field_spec=field_spec, + variables={"id": (self.category.id, "ID")}, + ) + + def test_committee_categories_private_fields(self): + # Test if private fields on committee categories cannot be retrieved via list view + for field_name, field_spec in self.MEMBERS_COMITTEECATEGORY_PRIVATE_FIELDS.items(): + # Wrap the field spec in "results { }" for list view + field_spec = f"results {{ {field_spec} }}" + self._test_public_model_and_private_field( + query_name="committeeCategories", field_name=field_name, field_spec=field_spec, + variables={"id": (self.category.id, "ID")} + ) diff --git a/amelie/members/graphql.py b/amelie/members/graphql.py index 0ad3ab7..77cc74e 100644 --- a/amelie/members/graphql.py +++ b/amelie/members/graphql.py @@ -42,7 +42,6 @@ class CommitteeFilterSet(FilterSet): class Meta: model = Committee fields = { - 'id': ("exact",), 'name': ("icontains", "iexact"), 'founded': ("exact", "gt", "lt"), 'abolished': ("exact", "gt", "lt"), @@ -124,6 +123,7 @@ class Meta: description = "Type definition for a single CommitteeCategory" filter_fields = { 'name': ("icontains", "iexact"), + 'id': ("exact",), } fields = ["id", "name", "slug", "committee_set"] @@ -154,7 +154,7 @@ class MembersQuery(graphene.ObjectType): committee_categories = DjangoPaginationConnectionField(CommitteeCategoryType) committee = graphene.Field(CommitteeType, id=graphene.ID(), slug=graphene.String()) - committees = DjangoPaginationConnectionField(CommitteeType) + committees = DjangoPaginationConnectionField(CommitteeType, id=graphene.ID(), slug=graphene.String()) def resolve_committee_category(root, info, id=None, slug=None): """Find committee category by ID or slug""" @@ -189,6 +189,31 @@ def resolve_committee(root, info, id=None, slug=None): return qs.get(slug=slug) return None + def resolve_committees(root, info, id=None, slug=None, *args, **kwargs): + """Find committees by ID or slug, if the user is allowed to see it""" + # Logged-in users can see more committees than non-logged-in users. + if hasattr(info.context, 'user') and info.context.user.is_authenticated: + # Board members can see all committees, including abolished ones + if info.context.is_board: + qs = Committee.objects + + # Logged-in users can see abolished committees that they were a part of + else: + qs = Committee.objects.filter( + Q(abolished__isnull=True) | Q(function__person=info.context.person) + ).distinct() + + # Non-logged in users are only allowed to see active committees + else: + qs = Committee.objects.filter(abolished__isnull=True) + + # Find the committee by its ID or slug + if id is not None: + return qs.filter(pk=id) + if slug is not None: + return qs.filter(slug=slug) + return qs + # Exports GRAPHQL_QUERIES = [MembersQuery] From 908852a893e97e7c5e15304bc85c2abaa44e81fd Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 9 Dec 2024 21:43:15 +0100 Subject: [PATCH 26/29] graphql: Add tests for news, publications and videos modules. This concludes our testing initiative, thanks for testing! --- amelie/graphql/tests/__init__.py | 2 +- amelie/graphql/tests/test_activities.py | 2 +- amelie/graphql/tests/test_news.py | 203 ++++++++++++++++++++++ amelie/graphql/tests/test_publications.py | 61 +++++++ amelie/graphql/tests/test_videos.py | 127 ++++++++++++++ amelie/news/graphql.py | 15 +- amelie/publications/graphql.py | 17 +- amelie/videos/graphql.py | 23 +-- 8 files changed, 430 insertions(+), 20 deletions(-) create mode 100644 amelie/graphql/tests/test_news.py create mode 100644 amelie/graphql/tests/test_publications.py create mode 100644 amelie/graphql/tests/test_videos.py diff --git a/amelie/graphql/tests/__init__.py b/amelie/graphql/tests/__init__.py index 0c1e98a..f732e41 100644 --- a/amelie/graphql/tests/__init__.py +++ b/amelie/graphql/tests/__init__.py @@ -86,7 +86,7 @@ def _test_private_model(self, query_name: str, public_field_spec: str = "id", ) def _test_private_model_list(self, query_name: str, public_field_spec: str = "id", - variables: Optional[Dict[str, Tuple[str, str]]] = None, + variables: Optional[Dict[str, Tuple[Union[str, int], str]]] = None, error_regex: Optional[re.Pattern] = None): """ Test if a model instance that should be private is not in the list returned by a GraphQL query. diff --git a/amelie/graphql/tests/test_activities.py b/amelie/graphql/tests/test_activities.py index a6c8c23..c4ec594 100644 --- a/amelie/graphql/tests/test_activities.py +++ b/amelie/graphql/tests/test_activities.py @@ -163,7 +163,7 @@ def test_activities_private_photo(self): response = self.query(query, variables={"id": self.public_activity.id}) content = json.loads(response.content) - # The request should succeedte + # The request should succeed self.assertResponseNoErrors( response, f"Query for 'activities', public field 'photos' returned an error!" diff --git a/amelie/graphql/tests/test_news.py b/amelie/graphql/tests/test_news.py new file mode 100644 index 0000000..73a4027 --- /dev/null +++ b/amelie/graphql/tests/test_news.py @@ -0,0 +1,203 @@ +import json + +from django.conf import settings +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.activities.models import Activity +from amelie.news.models import NewsItem +from amelie.files.models import Attachment +from amelie.members.models import Committee, Person +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests +from amelie.tools.tests import generate_activities + + +def generate_news_article() -> NewsItem: + """ + Generate News article for testing. + + It will generate 1 article with: + - a public attachment + - a private attachment + - a linked public activity + - a linked private activity + """ + + now = timezone.now() + committee = Committee.objects.first() + author = Person.objects.first() + + # Generate two activities, one public and one private + generate_activities(2) + + item = NewsItem( + publication_date=now, + title_nl=f"Nieuwsartikel", + title_en=f"News Article", + introduction_nl="Dit is een nieuwsartikel.", + introduction_en="This is a news article.", + content_nl="Dit is de inhoud.", + content_en="This is the content.", + publisher=committee, + author=author, + ) + item.save() + + # Add public attachment + public_attachment = Attachment( + public=True, file=SimpleUploadedFile("public.txt", b"File Contents") + ) + public_attachment.save(create_thumbnails=False) + item.attachments.add(public_attachment) + + # Add private attachment + private_attachment = Attachment( + public=False, file=SimpleUploadedFile("public.txt", b"File Contents") + ) + private_attachment.save(create_thumbnails=False) + item.attachments.add(private_attachment) + + # Add linked public activity + public_activity = Activity.objects.filter(public=True).order_by('-id').first() + item.activities.add(public_activity) + + # Add linked private activity + private_activity = Activity.objects.filter(public=False).order_by('-id').first() + item.activities.add(private_activity) + + return item + +class NewsGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the News app + """ + + def setUp(self): + super(NewsGraphQLPrivateFieldTests, self).setUp() + + # Create required committees for the news module + educom = Committee(name="EduCom", abbreviation=settings.EDUCATION_COMMITTEE_ABBR) + educom.save() + + # Generate news article + self.article = generate_news_article() + + def test_news_item_private_attachment(self): + # Test if private attachments are hidden in get view + query = "query ($id: ID) { newsItem(id: $id) { attachments { public }}}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItem', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['newsItem']['attachments']), + f"Query for 'newsItem', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['newsItem']['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'newsItem', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_news_items_private_attachment(self): + # Test if private attachments are hidden in list view + query = "query ($id: ID) { newsItems(id: $id) { results { attachments { public }}}}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItems', public field 'attachments' returned an error!" + ) + + # Check that all attachments are public, and that the correct amount of attachments are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['newsItems']['results'][0]['attachments']), + f"Query for 'newsItems', public field 'attachments' returned a private attachment!") + num_attachments = len(content['data']['newsItems']['results'][0]['attachments']) + self.assertEqual( + num_attachments, 1, + f"Query for 'newsItems', public field 'attachments' did not return 1 expected attachment (returned {num_attachments})!" + ) + + def test_news_item_private_activity(self): + # Test if private activities are hidden in get view + query = "query ($id: ID) { newsItem(id: $id) { activities { public }}}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItem', public field 'activities' returned an error!" + ) + + # Check that all activities are public, and that the correct amount of activities are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['newsItem']['activities']), + f"Query for 'newsItem', public field 'activities' returned a private attachment!") + num_activities = len(content['data']['newsItem']['activities']) + self.assertEqual( + num_activities, 1, + f"Query for 'newsItem', public field 'activities' did not return 1 expected attachment (returned {num_activities})!" + ) + + def test_news_items_private_activity(self): + # Test if private activities are hidden in list view + query = "query ($id: ID) { newsItems(id: $id) { results { activities { public }}}}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItems', public field 'activities' returned an error!" + ) + + # Check that all activities are public, and that the correct amount of activities are received (1) + self.assertTrue(all(a['public'] == True for a in content['data']['newsItems']['results'][0]['activities']), + f"Query for 'newsItems', public field 'activities' returned a private attachment!") + num_activities = len(content['data']['newsItems']['results'][0]['activities']) + self.assertEqual( + num_activities, 1, + f"Query for 'newsItems', public field 'activities' did not return 1 expected activity (returned {num_activities})!" + ) + + def test_news_item_author_publisher_string(self): + # Test if the author and publisher of a news item are a strings in get view + query = "query ($id: ID) { newsItem(id: $id) { author, publisher }}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItem', public fields 'author, publisher' returned an error!" + ) + + # Check that both author and publisher fields are strings + self.assertTrue(isinstance(content['data']['newsItem']['author'], str), + f"Query for 'newsItem', public field 'author' returned something else than a string!") + self.assertTrue(isinstance(content['data']['newsItem']['publisher'], str), + f"Query for 'newsItem', public field 'author' returned something else than a string!") + + def test_news_items_author_publisher_string(self): + # Test if the author and publisher of a news item are a strings in list view + query = "query ($id: ID) { newsItems(id: $id) { results { author, publisher }}}" + response = self.query(query, variables={"id": self.article.id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'newsItems', public fields 'author, publisher' returned an error!" + ) + + # Check that both author and publisher fields are strings + self.assertTrue(isinstance(content['data']['newsItems']['results'][0]['author'], str), + f"Query for 'newsItem', public field 'author' returned something else than a string!") + self.assertTrue(isinstance(content['data']['newsItems']['results'][0]['publisher'], str), + f"Query for 'newsItem', public field 'author' returned something else than a string!") diff --git a/amelie/graphql/tests/test_publications.py b/amelie/graphql/tests/test_publications.py new file mode 100644 index 0000000..80b9c59 --- /dev/null +++ b/amelie/graphql/tests/test_publications.py @@ -0,0 +1,61 @@ +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests +from amelie.publications.models import Publication, PublicationType + + +def generate_publication() -> Publication: + """ + Generate Publication for testing. + + It will generate 1 private publication + """ + + now = timezone.now() + + # Create PublicationType + publication_type = PublicationType( + type_name="Publication Type", + description="This is a publication type.", + default_thumbnail=SimpleUploadedFile("thumb.png", b"Some PNG") + ) + publication_type.save() + # Create publication + item = Publication( + name=f"Publication", + description="This is a publication", + date_published=now, + publication_type=publication_type, + file=SimpleUploadedFile("publication.txt", b"This is a very nice publication"), + public=False + ) + item.save() + return item + + +class PublicationsGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Publications app + """ + + def setUp(self): + super(PublicationsGraphQLPrivateFieldTests, self).setUp() + + # Generate two publications, one public and one private + self.private_publication = generate_publication() + + def test_publication_private_model(self): + # Test if private publication cannot be retrieved + self._test_private_model( + query_name="publication", + variables={"id": (self.private_publication.id, "ID")} + ) + + def test_publications_private_model(self): + # Test if private publication cannot be retrieved via list view + self._test_private_model_list( + query_name="publications", + public_field_spec="results { id }", + variables={"id": (self.private_publication.id, "ID")} + ) diff --git a/amelie/graphql/tests/test_videos.py b/amelie/graphql/tests/test_videos.py new file mode 100644 index 0000000..14d727b --- /dev/null +++ b/amelie/graphql/tests/test_videos.py @@ -0,0 +1,127 @@ +import json +from typing import Tuple + +from django.conf import settings +from django.core.files.uploadedfile import SimpleUploadedFile +from django.utils import timezone + +from amelie.activities.models import Activity +from amelie.news.models import NewsItem +from amelie.files.models import Attachment +from amelie.members.models import Committee, Person +from amelie.graphql.tests import BaseGraphQLPrivateFieldTests +from amelie.videos.models import BaseVideo, YouTubeVideo, StreamingIAVideo +from amelie.tools.tests import generate_activities + + +def generate_videos(): + """ + Generate Video for testing. + + It will generate 4 videos + - A public YouTube video + - A public Streaming.IA video + - A private YouTube video + - A private Streaming.IA video + """ + + now = timezone.now() + committee = Committee.objects.first() + + for i in range(2): + # Create video + item = YouTubeVideo( + video_id=i, + title=f"YouTube Video {i + 1}", + description="This is a Youtube video.", + date_published=now, + publisher=committee, + public=bool(i) + ) + item.save() + item = StreamingIAVideo( + video_id=i, + title=f"Streaming.IA Video {i + 1}", + description="This is a Streaming.IA video.", + date_published=now, + publisher=committee, + public=bool(i) + ) + item.save() + + +class VideosGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): + """ + Tests for private fields of models of the Videos app + """ + + def setUp(self): + super(VideosGraphQLPrivateFieldTests, self).setUp() + + # Generate four videos, public and private, YouTube and Streaming.IA videos. + generate_videos() + + # Retrieve and store those videos + self.public_yt_video = YouTubeVideo.objects.filter(public=True).order_by('-video_id').first() + self.private_yt_video = YouTubeVideo.objects.filter(public=False).order_by('-video_id').first() + self.public_ia_video = StreamingIAVideo.objects.filter(public=True).order_by('-video_id').first() + self.private_ia_video = StreamingIAVideo.objects.filter(public=False).order_by('-video_id').first() + + def test_video_private_model(self): + # Test if private videos cannot be retrieved + self._test_private_model( + query_name="video", + public_field_spec="videoId", + variables={"videoId": (self.private_yt_video.video_id, "ID")} + ) + self._test_private_model( + query_name="video", + public_field_spec="videoId", + variables={"videoId": (self.private_ia_video.video_id, "ID")} + ) + + def test_videos_private_model(self): + # Test if private videos cannot be retrieved via list view + self._test_private_model_list( + query_name="videos", + public_field_spec="results { videoId }", + variables={"videoId": (self.private_yt_video.video_id, "ID")} + ) + self._test_private_model_list( + query_name="videos", + public_field_spec="results { videoId }", + variables={"videoId": (self.private_ia_video.video_id, "ID")} + ) + + def test_video_publisher_string(self): + # Test if the publisher of a video is a string in get view + query = "query ($videoId: ID) { video(videoId: $videoId) { publisher }}" + response = self.query(query, variables={"videoId": self.public_yt_video.video_id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'video', public field 'publisher' returned an error!" + ) + + # Check that both author and publisher fields are strings + self.assertTrue(isinstance(content['data']['video']['publisher'], str), + f"Query for 'video', public field 'publisher' returned something else than a string!") + + def test_videos_publisher_string(self): + # Test if the publisher of a video is a string in list view + query = "query ($videoId: ID) { videos(videoId: $videoId) { results { publisher }}}" + response = self.query(query, variables={"videoId": self.public_yt_video.video_id}) + content = json.loads(response.content) + + # The request should succeed + self.assertResponseNoErrors( + response, + f"Query for 'videos', public field 'publisher' returned an error!" + ) + + # Check that both author and publisher fields are strings + self.assertTrue(isinstance(content['data']['videos']['results'][0]['publisher'], str), + f"Query for 'newsItem', public field 'publisher' returned something else than a string!") + diff --git a/amelie/news/graphql.py b/amelie/news/graphql.py index 0a25e6f..15becd6 100644 --- a/amelie/news/graphql.py +++ b/amelie/news/graphql.py @@ -12,7 +12,6 @@ class Meta: model = NewsItem description = "Type definition for a single News Item" filter_fields = { - 'id': ("exact", ), 'title_nl': ("icontains", "iexact"), 'title_en': ("icontains", "iexact"), 'publication_date': ("exact", "gt", "lt"), @@ -47,6 +46,10 @@ def resolve_attachments(self: NewsItem, info): # `info.context` is the Django Request object in Graphene return self.attachments.filter_public(info.context).all() + def resolve_activities(self: NewsItem, info): + # `info.context` is the Django Request object in Graphene + return self.activities.filter_public(info.context).all() + def resolve_author(obj: NewsItem, info): return obj.author.incomplete_name() @@ -65,11 +68,19 @@ def resolve_content(obj: NewsItem, info): class NewsQuery(graphene.ObjectType): news_item = graphene.Field(NewsItemType, id=graphene.ID()) - news_items = DjangoPaginationConnectionField(NewsItemType) + news_items = DjangoPaginationConnectionField(NewsItemType, id=graphene.ID()) def resolve_news_item(root, info, id): return NewsItem.objects.get(pk=id) + def resolve_news_items(root, info, id=None, *args, **kwargs): + """Find news items by ID""" + qs = NewsItem.objects + # Find the news item by its ID + if id is not None: + return qs.filter(pk=id) + return qs + # Exports GRAPHQL_QUERIES = [NewsQuery] diff --git a/amelie/publications/graphql.py b/amelie/publications/graphql.py index e8ab13f..91af8b6 100644 --- a/amelie/publications/graphql.py +++ b/amelie/publications/graphql.py @@ -1,3 +1,5 @@ +from datetime import time + import graphene from graphene_django import DjangoObjectType @@ -21,7 +23,6 @@ class Meta: model = Publication description = "Type definition for a single Publication" filter_fields = { - 'id': ("exact",), 'name': ("icontains", "iexact"), 'date_published': ("exact", "gt", "lt"), 'publication_type__type_name': ("icontains", "iexact"), @@ -39,21 +40,25 @@ class Meta: "public", ] - @classmethod - def get_queryset(cls, queryset, info): - return queryset.filter_public(info.context) - def resolve_thumbnail(obj: Publication, info): return obj.get_thumbnail() class PublicationQuery(graphene.ObjectType): publication = graphene.Field(PublicationItemType, id=graphene.ID()) - publications = DjangoPaginationConnectionField(PublicationItemType) + publications = DjangoPaginationConnectionField(PublicationItemType, id=graphene.ID()) def resolve_publication(root, info, id): return Publication.objects.filter_public(info.context).get(pk=id) + def resolve_publications(root, info, id=None, *args, **kwargs): + """Find publications by ID""" + qs = Publication.objects.filter_public(info.context) + # Find the publication by its ID + if id is not None: + return qs.filter(pk=id) + return qs + # Exports GRAPHQL_QUERIES = [PublicationQuery] diff --git a/amelie/videos/graphql.py b/amelie/videos/graphql.py index c34c719..f786b75 100644 --- a/amelie/videos/graphql.py +++ b/amelie/videos/graphql.py @@ -13,7 +13,6 @@ class VideoFilterSet(django_filters.FilterSet): class Meta: model = BaseVideo fields = { - 'video_id': ("exact",), 'title': ("icontains", "iexact"), 'date_published': ("exact", "gt", "lt"), 'publisher__name': ("icontains", "iexact"), @@ -55,10 +54,6 @@ class Meta: video_type = graphene.String(description=_("Video type (Youtube or IA)")) video_url = graphene.String(description=_("URL to the video")) - @classmethod - def get_queryset(cls, queryset, info): - return queryset.filter_public(info.context) - def resolve_publisher(obj: BaseVideo, info): return obj.publisher.name @@ -70,11 +65,19 @@ def resolve_video_url(obj: BaseVideo, info): class VideoQuery(graphene.ObjectType): - video = graphene.Field(VideoType, id=graphene.ID()) - videos = DjangoPaginationConnectionField(VideoType) - - def resolve_video(root, info, id): - return BaseVideo.objects.filter_public(info.context).get(pk=id) + video = graphene.Field(VideoType, video_id=graphene.ID()) + videos = DjangoPaginationConnectionField(VideoType, video_id=graphene.ID()) + + def resolve_video(root, info, video_id): + return BaseVideo.objects.filter_public(info.context).get(video_id=video_id) + + def resolve_videos(root, info, video_id=None, *args, **kwargs): + """Find videos by ID""" + qs = BaseVideo.objects.filter_public(info.context) + # Find the video by its Video ID + if video_id is not None: + return qs.filter(video_id=video_id) + return qs # Exports From df3ed6c086b9150b3ec0d105d0ed518c6b45247e Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 9 Dec 2024 23:00:31 +0100 Subject: [PATCH 27/29] Implement authentication on GraphQL types, on a field level using decorators --- amelie/graphql/decorators.py | 63 ++++++++++++++++++++++++++++++++++++ amelie/members/graphql.py | 23 +++++++++++++ 2 files changed, 86 insertions(+) diff --git a/amelie/graphql/decorators.py b/amelie/graphql/decorators.py index 7b45cd0..21202d0 100644 --- a/amelie/graphql/decorators.py +++ b/amelie/graphql/decorators.py @@ -1,5 +1,7 @@ from graphql import GraphQLError +from graphql_jwt.decorators import user_passes_test, login_required + def _get_attribute(obj, dotted_path): value = obj @@ -24,3 +26,64 @@ def wrapper_args_allow_only_self_or_board(self, info, *args, **kwargs): return func(self, info, *args, **kwargs) return wrapper_args_allow_only_self_or_board return wrapper_allow_only_self_or_board + + +AUTHORIZATION_FIELD_TYPES = ["public_fields", "login_fields", "committee_fields", "board_fields", "private_fields"] + +def is_board_or_www(user): + is_board = hasattr(user, 'person') and hasattr(user.person, 'is_board') and user.person.is_board + is_superuser = hasattr(user, 'is_superuser') and user.is_superuser + return is_board or is_superuser + +def committee_required(committees: list): + return user_passes_test(lambda u:is_board_or_www(u) or (hasattr(u, 'person') and hasattr(u.person, 'is_in_committee') and any(u.person.is_in_committee(committee) for committee in committees))) + +def board_required(): + return user_passes_test(lambda u: is_board_or_www(u)) + +def no_access(): + return user_passes_test(lambda u: False) + +def check_authorization(cls): + # Make sure that at least one of the authorization fields is present. + if not any(hasattr(cls, authorization_field) for authorization_field in AUTHORIZATION_FIELD_TYPES): + raise ValueError(f"At least one authorization field type should be defined for a GraphQL type, choose from: {', '.join(AUTHORIZATION_FIELD_TYPES)}") + + public_fields = getattr(cls, "public_fields", []) + login_fields = getattr(cls, "login_fields", []) + committee_fields = getattr(cls, "committee_fields", []) + board_fields = getattr(cls, "board_fields", []) + private_fields = getattr(cls, "private_fields", []) + + allowed_committees = getattr(cls, "allowed_committees", []) + + # If there are committee fields defined, then the allowed committee list cannot be non-empty + if len(committee_fields) > 0 and len(allowed_committees) == 0: + raise ValueError(f"The following fields are only visible by a committee: \"{','.join(committee_fields)}\", but there are no committees defined that can view this field. Make sure that \"allowed_committees\" has at least a single entry.") + + # Make sure that all the fields in the authorization fields are mutually exclusive. + authorization_fields = [*public_fields, *login_fields, *committee_fields, *board_fields, *private_fields] + if len(authorization_fields) != len(set(authorization_fields)): + raise ValueError("Some of the authorization fields have overlapping Django fields. Make sure that they are all mutually exclusive!") + + # Make sure that all the fields that are defined in the fields list are in the authorization fields. + if not all((missing_field := field) in authorization_fields for field in cls._meta.fields): + raise ValueError(f"The field \"{missing_field}\" is defined in the Django fields list, but not in an authorization field list. All the django fields must be present in the authorization fields.") + + # Require a user to be signed in. + for login_field in login_fields: + setattr(cls, f"resolve_{login_field}", login_required(lambda self, info, field=login_field: getattr(self, login_field))) + + # Require a user to be in a committee + for committee_field in committee_fields: + setattr(cls, f"resolve_{committee_field}", committee_required(allowed_committees)(lambda self, info, field=committee_field: getattr(self, committee_field))) + + # Require a user to be in the board + for board_field in board_fields: + setattr(cls, f"resolve_{board_field}", board_required()(lambda self, info, field=board_field: getattr(self, board_field))) + + # No-one can access these fields + for private_field in private_fields: + setattr(cls, f"resolve_{private_field}", no_access()) + + return cls diff --git a/amelie/members/graphql.py b/amelie/members/graphql.py index 0ad3ab7..2c3d67d 100644 --- a/amelie/members/graphql.py +++ b/amelie/members/graphql.py @@ -6,6 +6,8 @@ from django_filters import FilterSet from django.db.models import Q from django.utils.translation import gettext_lazy as _ + +from amelie.graphql.decorators import check_authorization from amelie.graphql.pagination.connection_field import DjangoPaginationConnectionField from amelie.members.models import Committee, Function, CommitteeCategory @@ -69,7 +71,28 @@ def include_abolished_filter(self, qs, filter_field, value): return qs.filter(abolished__isnull=True) +@check_authorization class CommitteeType(DjangoObjectType): + public_fields = [ + "id", + "name", + "category", + "parent_committees", + "slug", + "email", + "abolished", + "website", + "information_nl", + "information_en", + "group_picture", + "function_set" + ] + committee_fields = [ + "founded" + ] + allowed_committees = ["WWW"] + private_fields = ["logo", "information"] + class Meta: model = Committee description = "Type definition for a single Committee" From a75777a243326f8a840a57a779452492a13d8769 Mon Sep 17 00:00:00 2001 From: Kevin Alberts Date: Mon, 23 Dec 2024 13:10:29 +0100 Subject: [PATCH 28/29] graphql: Small changes after review --- amelie/graphql/tests/__init__.py | 8 ++++---- amelie/graphql/tests/test_activities.py | 8 ++++---- amelie/graphql/tests/test_companies.py | 4 ++-- amelie/graphql/tests/test_education.py | 12 ++++-------- amelie/graphql/tests/test_news.py | 18 +++++++++--------- amelie/graphql/tests/test_videos.py | 4 ++-- amelie/settings/local.py.default | 5 ++++- amelie/settings/local.py.localdev | 5 ++++- 8 files changed, 33 insertions(+), 31 deletions(-) diff --git a/amelie/graphql/tests/__init__.py b/amelie/graphql/tests/__init__.py index f732e41..3a799b8 100644 --- a/amelie/graphql/tests/__init__.py +++ b/amelie/graphql/tests/__init__.py @@ -76,7 +76,7 @@ def _test_private_model(self, query_name: str, public_field_spec: str = "id", ) # Check if the error received has the correct error message format, so we don't # accidentally consider a different error as a 'successful' result. - content = json.loads(response.content) + content = response.json() for error in content['errors']: # If different error than expected, throw error. self.assertRegex( @@ -132,10 +132,10 @@ def _test_private_model_list(self, query_name: str, public_field_spec: str = "id ) # Check if the results list is empty. - content = json.loads(response.content) + content = response.json() num_obj = len(content['data'][query_name]['results']) self.assertEqual( - content['data'][query_name]['results'], [], + num_obj, 0, f"Query for '{query_name}', private object '{query_variables}' did not return 0 expected objects (returned {num_obj})!" ) @@ -180,7 +180,7 @@ def _test_public_model_and_private_field(self, query_name: str, field_name: str, ) # Check if the error received has the correct error message format, so we don't # accidentally consider a different error as a 'successful' result. - content = json.loads(response.content) + content = response.json() for error in content['errors']: # If different error than expected, throw error. self.assertRegex( diff --git a/amelie/graphql/tests/test_activities.py b/amelie/graphql/tests/test_activities.py index c4ec594..949cb04 100644 --- a/amelie/graphql/tests/test_activities.py +++ b/amelie/graphql/tests/test_activities.py @@ -98,7 +98,7 @@ def test_activity_private_attachment(self): # Test if private activity attachments are hidden in get view query = "query ($id: ID) { activity(id: $id) { attachments { public }}}" response = self.query(query, variables={"id": self.public_activity.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -119,7 +119,7 @@ def test_activities_private_attachment(self): # Test if private activity attachments are hidden in list view query = "query ($id: ID) { activities(id: $id) { results { attachments { public }}}}" response = self.query(query, variables={"id": self.public_activity.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -140,7 +140,7 @@ def test_activity_private_photo(self): # Test if private activity photos are hidden in get view query = "query ($id: ID) { activity(id: $id) { photos { public }}}" response = self.query(query, variables={"id": self.public_activity.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -161,7 +161,7 @@ def test_activities_private_photo(self): # Test if private activity photos are hidden in list view query = "query ($id: ID) { activities(id: $id) { results { photos { public }}}}" response = self.query(query, variables={"id": self.public_activity.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( diff --git a/amelie/graphql/tests/test_companies.py b/amelie/graphql/tests/test_companies.py index 9ff56f7..911a9b8 100644 --- a/amelie/graphql/tests/test_companies.py +++ b/amelie/graphql/tests/test_companies.py @@ -163,7 +163,7 @@ def test_company_event_private_attachment(self): # Test if private event attachments are hidden in get view query = "query ($id: ID) { companyEvent(id: $id) { attachments { public }}}" response = self.query(query, variables={"id": self.public_visible_event.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -184,7 +184,7 @@ def test_company_events_private_attachment(self): # Test if private event attachments are hidden in list view query = "query ($id: ID) { companyEvents(id: $id) { results { attachments { public }}}}" response = self.query(query, variables={"id": self.public_visible_event.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( diff --git a/amelie/graphql/tests/test_education.py b/amelie/graphql/tests/test_education.py index d687073..84eb96b 100644 --- a/amelie/graphql/tests/test_education.py +++ b/amelie/graphql/tests/test_education.py @@ -16,11 +16,7 @@ def generate_education_events(): """ Generate Education Events for testing. - It will generate 4 events: - - A public event that is visible - - A public event that is not visible - - A private event that is visible - - A private event that is not visible + It will generate a public and a private event. """ now = timezone.now() @@ -126,7 +122,7 @@ def test_education_event_private_attachment(self): # Test if private event attachments are hidden in get view query = "query ($id: ID) { educationEvent(id: $id) { attachments { public }}}" response = self.query(query, variables={"id": self.public_event.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -136,7 +132,7 @@ def test_education_event_private_attachment(self): # Check that all attachments are public, and that the correct amount of attachments are received (1) self.assertTrue(all(a['public'] == True for a in content['data']['educationEvent']['attachments']), - f"Query for 'educationEvent', public field 'attachments' returned a private attachment!") + "Query for 'educationEvent', public field 'attachments' returned a private attachment!") num_attachments = len(content['data']['educationEvent']['attachments']) self.assertEqual( num_attachments, 1, @@ -147,7 +143,7 @@ def test_education_events_private_attachment(self): # Test if private event attachments are hidden in list view query = "query ($id: ID) { educationEvents(id: $id) { results { attachments { public }}}}" response = self.query(query, variables={"id": self.public_event.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( diff --git a/amelie/graphql/tests/test_news.py b/amelie/graphql/tests/test_news.py index 73a4027..f0fc81c 100644 --- a/amelie/graphql/tests/test_news.py +++ b/amelie/graphql/tests/test_news.py @@ -75,9 +75,9 @@ class NewsGraphQLPrivateFieldTests(BaseGraphQLPrivateFieldTests): def setUp(self): super(NewsGraphQLPrivateFieldTests, self).setUp() - # Create required committees for the news module - educom = Committee(name="EduCom", abbreviation=settings.EDUCATION_COMMITTEE_ABBR) - educom.save() + # A committee with the abbreviation of the education committee is required for the news module + # functions to work properly. So we get_or_create it here to make sure it exists in the test DB. + _ = Committee.objects.get_or_create(name="EduCom", abbreviation=settings.EDUCATION_COMMITTEE_ABBR) # Generate news article self.article = generate_news_article() @@ -86,7 +86,7 @@ def test_news_item_private_attachment(self): # Test if private attachments are hidden in get view query = "query ($id: ID) { newsItem(id: $id) { attachments { public }}}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -107,7 +107,7 @@ def test_news_items_private_attachment(self): # Test if private attachments are hidden in list view query = "query ($id: ID) { newsItems(id: $id) { results { attachments { public }}}}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -128,7 +128,7 @@ def test_news_item_private_activity(self): # Test if private activities are hidden in get view query = "query ($id: ID) { newsItem(id: $id) { activities { public }}}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -149,7 +149,7 @@ def test_news_items_private_activity(self): # Test if private activities are hidden in list view query = "query ($id: ID) { newsItems(id: $id) { results { activities { public }}}}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -170,7 +170,7 @@ def test_news_item_author_publisher_string(self): # Test if the author and publisher of a news item are a strings in get view query = "query ($id: ID) { newsItem(id: $id) { author, publisher }}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -188,7 +188,7 @@ def test_news_items_author_publisher_string(self): # Test if the author and publisher of a news item are a strings in list view query = "query ($id: ID) { newsItems(id: $id) { results { author, publisher }}}" response = self.query(query, variables={"id": self.article.id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( diff --git a/amelie/graphql/tests/test_videos.py b/amelie/graphql/tests/test_videos.py index 14d727b..f4b72d6 100644 --- a/amelie/graphql/tests/test_videos.py +++ b/amelie/graphql/tests/test_videos.py @@ -97,7 +97,7 @@ def test_video_publisher_string(self): # Test if the publisher of a video is a string in get view query = "query ($videoId: ID) { video(videoId: $videoId) { publisher }}" response = self.query(query, variables={"videoId": self.public_yt_video.video_id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( @@ -113,7 +113,7 @@ def test_videos_publisher_string(self): # Test if the publisher of a video is a string in list view query = "query ($videoId: ID) { videos(videoId: $videoId) { results { publisher }}}" response = self.query(query, variables={"videoId": self.public_yt_video.video_id}) - content = json.loads(response.content) + content = response.json() # The request should succeed self.assertResponseNoErrors( diff --git a/amelie/settings/local.py.default b/amelie/settings/local.py.default index c2d82b6..62c9d65 100644 --- a/amelie/settings/local.py.default +++ b/amelie/settings/local.py.default @@ -31,9 +31,12 @@ DATABASES = { # Definitely DON'T put these settings in production! ENV = 'DEBUG' DEBUG = True -DEBUG_TOOLBAR = True and "test" not in sys.argv +DEBUG_TOOLBAR = True ALLOWED_HOSTS = ["*"] +# Debug toolbar does not work during tests, so to make tests work, we exclude the toolbar if we're testing +DEBUG_TOOLBAR = DEBUG_TOOLBAR and "test" not in sys.argv + # Default setting for enabling profiling (the rest of the config is done in local.py(.default) # If this is turned on a lot of data will be generated and stored in the database. So only turn it on if you feel bold. ENABLE_REQUEST_PROFILING = False diff --git a/amelie/settings/local.py.localdev b/amelie/settings/local.py.localdev index a6c9673..267200c 100644 --- a/amelie/settings/local.py.localdev +++ b/amelie/settings/local.py.localdev @@ -23,9 +23,12 @@ DATABASES = { # Definitely DON'T put these settings in production! ENV = 'DEBUG' DEBUG = True -DEBUG_TOOLBAR = True and "test" not in sys.argv +DEBUG_TOOLBAR = True ALLOWED_HOSTS = ["*"] +# Debug toolbar does not work during tests, so to make tests work, we exclude the toolbar if we're testing +DEBUG_TOOLBAR = DEBUG_TOOLBAR and "test" not in sys.argv + # Disable secure redirects to allow local development without SSL SECURE_SSL_REDIRECT = False From f683427f81ccf411eb50b04392443695a6cf4711 Mon Sep 17 00:00:00 2001 From: supertom01 Date: Mon, 23 Dec 2024 19:44:40 +0100 Subject: [PATCH 29/29] Extend documentation and add a list of exempt fields --- amelie/graphql/decorators.py | 40 ++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/amelie/graphql/decorators.py b/amelie/graphql/decorators.py index 21202d0..2d192b1 100644 --- a/amelie/graphql/decorators.py +++ b/amelie/graphql/decorators.py @@ -1,6 +1,7 @@ from graphql import GraphQLError from graphql_jwt.decorators import user_passes_test, login_required +from graphql_jwt.exceptions import PermissionDenied def _get_attribute(obj, dotted_path): @@ -45,6 +46,40 @@ def no_access(): return user_passes_test(lambda u: False) def check_authorization(cls): + """ + Enforces authorization checks when this model is queried. + + There are multiple types of fields, each can be defined on the DjangoObjectType: + + * public_fields: Fields that are accessible for people within being signed in. + * login_fields: Fields that are only accessible after being signed in. + * committee_fields: Fields that are only accessible by members of a committee, WWW superusers, and board members. + * allowed_committees: When committee fields are defined, acronyms of visible committees should be passed. + * board_fields: Fields that are only accessible by WWW superusers and board members. + * private_fields: Fields that cannot be queried through the GraphQL API. + * exempt_fields: Fields that are exempt from these checks, + their resolvers should have their own authorization checking. + + An example class would be: + ```python + class FooType(DjangoObjectType): + public_fields = ['id'] + login_fields = ['login'] + committee_fields = ['committee'] + allowed_committees = ['some-committee'] + board_fields = ['board'] + private_fields = ['private'] + exempt_fields = ['exempt'] + + class Meta: + model = Foo + fields = ['id', 'login', 'committee', 'board', 'private', 'exempt'] + + def resolve_exempt(obj: Foo, info): + # Custom authorization checks + return obj + ``` + """ # Make sure that at least one of the authorization fields is present. if not any(hasattr(cls, authorization_field) for authorization_field in AUTHORIZATION_FIELD_TYPES): raise ValueError(f"At least one authorization field type should be defined for a GraphQL type, choose from: {', '.join(AUTHORIZATION_FIELD_TYPES)}") @@ -54,6 +89,7 @@ def check_authorization(cls): committee_fields = getattr(cls, "committee_fields", []) board_fields = getattr(cls, "board_fields", []) private_fields = getattr(cls, "private_fields", []) + exempt_fields = getattr(cls, "exempt_fields", []) allowed_committees = getattr(cls, "allowed_committees", []) @@ -62,7 +98,7 @@ def check_authorization(cls): raise ValueError(f"The following fields are only visible by a committee: \"{','.join(committee_fields)}\", but there are no committees defined that can view this field. Make sure that \"allowed_committees\" has at least a single entry.") # Make sure that all the fields in the authorization fields are mutually exclusive. - authorization_fields = [*public_fields, *login_fields, *committee_fields, *board_fields, *private_fields] + authorization_fields = [*public_fields, *login_fields, *committee_fields, *board_fields, *private_fields, *exempt_fields] if len(authorization_fields) != len(set(authorization_fields)): raise ValueError("Some of the authorization fields have overlapping Django fields. Make sure that they are all mutually exclusive!") @@ -84,6 +120,6 @@ def check_authorization(cls): # No-one can access these fields for private_field in private_fields: - setattr(cls, f"resolve_{private_field}", no_access()) + setattr(cls, f"resolve_{private_field}", no_access()(lambda self, info, field: False)) return cls