Skip to content

Commit

Permalink
Merge branch 'master' into ogc-1998-landsgemeinde-file-upload
Browse files Browse the repository at this point in the history
  • Loading branch information
BreathingFlesh committed Dec 31, 2024
2 parents a2cd841 + ee62c7a commit 60f3095
Show file tree
Hide file tree
Showing 6 changed files with 122 additions and 103 deletions.
2 changes: 1 addition & 1 deletion src/onegov/landsgemeinde/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ def get_top_navigation(
yield ( # type:ignore[misc]
Bunch(id=-1, access='public', published=True),
Link(
text=_('Assemblies'),
text=_('Archive'),
url=request.class_link(AssemblyCollection)
),
()
Expand Down
4 changes: 2 additions & 2 deletions src/onegov/landsgemeinde/layouts/assembly.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class AssemblyCollectionLayout(DefaultLayout):

@cached_property
def title(self) -> str:
return _('Assemblies')
return _('Archive')

@cached_property
def og_description(self) -> str:
Expand Down Expand Up @@ -74,7 +74,7 @@ def breadcrumbs(self) -> list[Link]:
return [
Link(_('Homepage'), self.homepage_url),
Link(
_('Assemblies'),
_('Archive'),
self.request.link(self.assembly_collection())
),
Link(self.title, self.request.link(self.model))
Expand Down
1 change: 0 additions & 1 deletion src/onegov/landsgemeinde/templates/macros.pt
Original file line number Diff line number Diff line change
Expand Up @@ -244,7 +244,6 @@
</metal:search_result_files>

<metal:footer_contact define-macro="footer_contact" i18n:domain="onegov.landsgemeinde">
<h5 tal:condition="contact or contact_url">Auskunft</h5>
<div tal:content="layout.org.contact_html" />
<a tal:condition="contact_url" tal:attributes="href contact_url"><strong><tal:b i18n:translate>more</tal:b>…</strong></a>
</metal:footer_contact>
Expand Down
92 changes: 50 additions & 42 deletions src/onegov/search/indexer.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from operator import itemgetter
from queue import Queue, Empty, Full

from sqlalchemy.orm.exc import ObjectDeletedError

from onegov.core.utils import is_non_string_iterable
from onegov.search import index_log, log, Searchable, utils
from onegov.search.errors import SearchOfflineError
Expand Down Expand Up @@ -907,59 +909,65 @@ def put(self, translation: 'Task') -> None:
log.error('The orm event translator queue is full!')

def index(self, schema: str, obj: Searchable) -> None:
if obj.es_skip:
return
try:
if obj.es_skip:
return

if obj.es_language == 'auto':
language = self.detector.detect_object_language(obj)
else:
language = obj.es_language
if obj.es_language == 'auto':
language = self.detector.detect_object_language(obj)
else:
language = obj.es_language

translation: IndexTask = {
'action': 'index',
'id': getattr(obj, obj.es_id),
'id_key': obj.es_id,
'schema': schema,
'type_name': obj.es_type_name, # FIXME: not needed for fts
'tablename': obj.__tablename__, # type:ignore[attr-defined]
'language': language,
'properties': {}
}

translation: IndexTask = {
'action': 'index',
'id': getattr(obj, obj.es_id),
'id_key': obj.es_id,
'schema': schema,
'type_name': obj.es_type_name, # FIXME: not needed for fts
'tablename': obj.__tablename__, # type:ignore[attr-defined]
'language': language,
'properties': {}
}
mapping_ = self.mappings[obj.es_type_name].for_language(language)

mapping_ = self.mappings[obj.es_type_name].for_language(language)
for prop, mapping in mapping_.items():

for prop, mapping in mapping_.items():
if prop == 'es_suggestion':
continue

if prop == 'es_suggestion':
continue
convert = self.converters.get(mapping['type'], lambda v: v)
raw = getattr(obj, prop)

convert = self.converters.get(mapping['type'], lambda v: v)
raw = getattr(obj, prop)
if is_non_string_iterable(raw):
translation['properties'][prop] = [convert(v) for v in raw]
else:
translation['properties'][prop] = convert(raw)

if is_non_string_iterable(raw):
translation['properties'][prop] = [convert(v) for v in raw]
if obj.es_public:
contexts = {'es_suggestion_context': ['public']}
else:
translation['properties'][prop] = convert(raw)
contexts = {'es_suggestion_context': ['private']}

if obj.es_public:
contexts = {'es_suggestion_context': ['public']}
else:
contexts = {'es_suggestion_context': ['private']}

suggestion = obj.es_suggestion
suggestion = obj.es_suggestion

if is_non_string_iterable(suggestion):
translation['properties']['es_suggestion'] = {
'input': suggestion,
'contexts': contexts
}
else:
translation['properties']['es_suggestion'] = {
'input': [suggestion],
'contexts': contexts
}
if is_non_string_iterable(suggestion):
translation['properties']['es_suggestion'] = {
'input': suggestion,
'contexts': contexts
}
else:
translation['properties']['es_suggestion'] = {
'input': [suggestion],
'contexts': contexts
}

self.put(translation)
self.put(translation)
except ObjectDeletedError as ex:
if hasattr(obj, 'id'):
log.error(f'Object {obj.id} was deleted before indexing: {ex}')
else:
log.error(f'Object {obj} was deleted before indexing: {ex}')

def delete(self, schema: str, obj: Searchable) -> None:

Expand Down
114 changes: 63 additions & 51 deletions tests/onegov/fsi/test_models.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import datetime

from freezegun import freeze_time
from sedate import utcnow

from onegov.fsi.models.course_attendee import CourseAttendee
Expand Down Expand Up @@ -44,57 +46,67 @@ def test_attendee(


def test_course_event(scenario):

scenario.add_attendee()
scenario.add_course(name='Course')
scenario.add_course_event(scenario.latest_course, max_attendees=20)
delta = datetime.timedelta(days=366)

# Add a participant via a subscription
event = scenario.latest_event
scenario.add_subscription(event, None, dummy_desc='Placeholder')
scenario.add_subscription(event, scenario.latest_attendee)

# Add inactive attendee
scenario.add_attendee(active=False)
scenario.add_subscription(event, scenario.latest_attendee)

scenario.commit()
scenario.refresh()

event = scenario.latest_event
assert event.subscriptions.count() == 3
assert event.attendees.count() == 2
assert event.available_seats == 20 - 3
assert event.possible_subscribers().first() is None

# Test possible and excluded subscribers
scenario.add_attendee(username='[email protected]')
attendee_2 = scenario.latest_attendee

# event = scenario.latest_event
assert event.course
assert event.possible_subscribers(year=event.end.year).all() == [
attendee_2
]

scenario.add_course_event(
scenario.latest_course,
start=event.start + delta, end=event.end + delta,
max_attendees=20
)
event2 = scenario.latest_event

# Event for a year later, exclude the one who has a subscription to this
# course
assert event.possible_subscribers(year=event.end.year + 1).count() == 1
assert event2.possible_subscribers(year=event.end.year).count() == 1
assert event2.possible_subscribers(year=event.end.year + 1).count() == 2
assert event.possible_subscribers(external_only=True).count() == 0
assert event.excluded_subscribers().count() == 2
assert event2.possible_subscribers().first() == attendee_2

assert scenario.latest_course.future_events.count() == 2
# if current date is last or second last day of the year, then freeze to
# 28th of december
if utcnow().date().month == 12 and utcnow().date().day in (30, 31):
freeze_date = '2024-12-28'
else:
freeze_date = utcnow().date()

with freeze_time(freeze_date):
scenario.add_attendee()
scenario.add_course(name='Course')
scenario.add_course_event(scenario.latest_course, max_attendees=20)
delta = datetime.timedelta(days=366)

# Add a participant via a subscription
event = scenario.latest_event
scenario.add_subscription(event, None, dummy_desc='Placeholder')
scenario.add_subscription(event, scenario.latest_attendee)

# Add inactive attendee
scenario.add_attendee(active=False)
scenario.add_subscription(event, scenario.latest_attendee)

scenario.commit()
scenario.refresh()

event = scenario.latest_event
assert event.subscriptions.count() == 3
assert event.attendees.count() == 2
assert event.available_seats == 20 - 3
assert event.possible_subscribers().first() is None

# Test possible and excluded subscribers
scenario.add_attendee(username='[email protected]')
attendee_2 = scenario.latest_attendee

# event = scenario.latest_event
assert event.course
assert event.possible_subscribers(year=event.end.year).all() == [
attendee_2
]

scenario.add_course_event(
scenario.latest_course,
start=event.start + delta, end=event.end + delta,
max_attendees=20
)
event2 = scenario.latest_event

# Event for a year later, exclude the one who has a subscription to
# this course
assert event.possible_subscribers(
year=event.end.year + 1).count() == 1
assert event2.possible_subscribers(
year=event.end.year).count() == 1
assert event2.possible_subscribers(
year=event.end.year + 1).count() == 2
assert event.possible_subscribers(external_only=True).count() == 0
assert event.excluded_subscribers().count() == 2
assert event2.possible_subscribers().first() == attendee_2

assert scenario.latest_course.future_events.count() == 2


def test_subscription(session, attendee, course_event):
Expand Down
12 changes: 6 additions & 6 deletions tests/onegov/landsgemeinde/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@ def assert_last_modified():

client_with_es.login('[email protected]', 'hunter2')

page = client_with_es.get('/').click('Landsgemeinden')
page = client_with_es.get('/').click('Archiv')
assert 'Noch keine Landsgemeinden erfasst.' in page
assert 'Zum Liveticker' not in page

# add assembly
with freeze_time('2023-05-07 9:30'):
page = page.click('Landsgemeinde', index=1)
page = page.click('Landsgemeinde')
page.form['date'] = '2023-05-07'
page.form['state'] = 'ongoing'
page.form['overview'] = '<p>Lorem ipsum</p>'
Expand Down Expand Up @@ -167,15 +167,15 @@ def assert_last_modified():
# delete agenda item
with freeze_time('2023-05-07 9:37'):
page.click('Löschen')
page = page.click('Landsgemeinde', index=2)
page = page.click('Landsgemeinde', index=1)
assert '<p>Lorem ipsum dolor sit amet</p>' in page
assert 'A. consectetur adipiscing' not in page
assert_last_modified()

# delete landsgemeinde
with freeze_time('2023-05-07 9:38'):
page.click('Löschen')
page = page.click('Landsgemeinden', index=0)
page = page.click('Archiv', index=0)
assert 'Noch keine Landsgemeinden erfasst.' in page


Expand All @@ -189,8 +189,8 @@ def test_view_pages_cache(landsgemeinde_app):

# add assembly
client.login('[email protected]', 'hunter2')
page = client.get('/').click('Landsgemeinden')
page = page.click('Landsgemeinde', index=1)
page = client.get('/').click('Archiv')
page = page.click('Landsgemeinde')
page.form['date'] = '2023-05-07'
page.form['state'] = 'completed'
page.form['overview'] = 'Lorem'
Expand Down

0 comments on commit 60f3095

Please sign in to comment.