Skip to content
This repository has been archived by the owner on Sep 5, 2019. It is now read-only.

Commit

Permalink
Adds the ability to deny selected dates from a reservation ticket
Browse files Browse the repository at this point in the history
Resolves #189
  • Loading branch information
Denis Krienbühl committed Apr 29, 2016
1 parent 0234693 commit ebd14e5
Show file tree
Hide file tree
Showing 11 changed files with 264 additions and 99 deletions.
7 changes: 5 additions & 2 deletions HISTORY.rst
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
Changelog
---------

- Removes extra text in ticket closed e-mail.
- Adds the ability to create multiple reservations in one ticket.
[href]

- Adds the ability to create multiple reservations in one ticket.
- Adds the ability to deny selected dates from a reservation ticket.
[href]

- Removes extra text in ticket closed e-mail.
[href]

- Shows an error if an uploaded's filename is too long.
Expand Down
5 changes: 3 additions & 2 deletions onegov/town/elements.py
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,10 @@ def __init__(self, src, alt=None, title=None, url=None):
class LinkGroup(HiddenElementMixin):
""" Represents a list of links. """

__slots__ = ['title', 'links', 'model']
__slots__ = ['title', 'links', 'model', 'right_side']

def __init__(self, title, links, model=None):
def __init__(self, title, links, model=None, right_side=True):
self.title = title
self.links = links
self.model = model
self.right_side = right_side
78 changes: 50 additions & 28 deletions onegov/town/locale/de_ch/LC_MESSAGES/onegov.town.po
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE 1.0\n"
"POT-Creation-Date: 2016-04-28 12:26+0200\n"
"POT-Creation-Date: 2016-04-28 16:18+0200\n"
"PO-Revision-Date: 2015-10-15 09:42+0200\n"
"Last-Translator: Denis Krienbühl <denis.krienbuehl@seantis.ch>\n"
"Language-Team: German\n"
Expand Down Expand Up @@ -659,18 +659,12 @@ msgstr "Älter"
msgid "Event"
msgstr "Veranstaltung"

msgid "Reject reservations"
msgstr "Reservationen absagen"

msgid "Edit submission"
msgstr "Eingabe bearbeiten"

msgid "Reject reservation"
msgstr "Reservation absagen"

msgid "Do you really want to reject this reservation?"
msgstr "Möchten Sie diese Reservation wirklich absagen?"

msgid "Rejecting this reservation can't be undone."
msgstr "Eine Absage kann nicht rückgängig gemacht werden."

msgid "Details about the reservation"
msgstr "Details zu Ihrer Reservation"

Expand All @@ -686,15 +680,38 @@ msgstr "Eine Absage kann nicht rückgängig gemacht werden."
msgid "Edit event"
msgstr "Veranstaltung bearbeiten"

msgid "Accept reservation"
msgstr "Reservation annehmen"
msgid "Accept all reservations"
msgstr "Alle Reservationen annehmen"

msgid "Reject all"
msgstr "Alle absagen"

msgid "Do you really want to reject all reservations?"
msgstr "Möchten Sie wirklich alle Reservationen absagen?"

msgid "Rejecting these reservations can't be undone."
msgstr "Die Absage aller Reservationen kann nicht rückgängig gemacht werden."

msgid "Edit details"
msgstr "Details bearbeiten"

msgid "Accept event"
msgstr "Veranstaltung annehmen"

#, python-format
msgid "Reject ${title}"
msgstr "${title} absagen"

msgid "Do you really want to reject this reservation?"
msgstr "Möchten Sie diese Reservation wirklich absagen?"

#, python-format
msgid "Rejecting ${title} can't be undone."
msgstr "Die Absage von ${title} kann nicht rückgängig gemacht werden."

msgid "Reject reservation"
msgstr "Reservation absagen"

msgid "Link"
msgstr "Verknüpfung"

Expand Down Expand Up @@ -1085,11 +1102,11 @@ msgstr ""
"Sie können dieses E-Mail ignorieren, falls Sie Ihr Passwort nicht ändern "
"möchten."

msgid "Your reservation has been accepted:"
msgstr "Ihre Reservation wurde angenommen:"
msgid "The following reservations have been accepted:"
msgstr "Die folgenden Reservationen wurden angenommen:"

msgid "Your reservation has unfortunately been rejected:"
msgstr "Ihre Reservation musste leider abgesagt werden:"
msgid "The following reservations has unfortunately been rejected:"
msgstr "Die folgenden Reservationen mussten leider abgesagt werden:"

msgid "Your ticket has been closed"
msgstr "Ihr Ticket wurde geschlossen"
Expand Down Expand Up @@ -1173,7 +1190,9 @@ msgid "Go to calendar"
msgstr "Zum Kalender"

msgid "Select a free time span in the calendar below to create an allocation."
msgstr "Wählen Sie eine freie Zeitspanne im Kalender aus um eine Einteilung zu machen."
msgstr ""
"Wählen Sie eine freie Zeitspanne im Kalender aus um eine Einteilung zu "
"machen."

msgid "Further Information"
msgstr "Weitere Informationen"
Expand Down Expand Up @@ -1439,9 +1458,6 @@ msgstr "Weiter"
msgid "Confirm your reservation"
msgstr "Bestätigen Sie Ihre Reservation"

msgid "The reservation was rejected"
msgstr "Die Reservation wurde abgesagt"

msgid "Reserve"
msgstr "Reservieren"

Expand All @@ -1451,17 +1467,23 @@ msgstr "Bestätigen"
msgid "Thank you for your reservation!"
msgstr "Vielen Dank für Ihre Reservation!"

msgid "The reservation was accepted"
msgstr "Die Reservation wurde angenommen"
msgid "The reservations were accepted"
msgstr "Die Reservationen wurden angenommen"

msgid "The reservations have already been accepted"
msgstr "Die Reservationen wurden bereits angenommen"

msgid "The reservation has already been accepted"
msgstr "Die Reservation wurde bereits angenommen"
msgid "The following reservations were rejected"
msgstr "Die folgenden Reservationen wurden abgelehnt"

msgid "Your reservation was rejected"
msgstr "Ihre Reservation wurde abgesagt"
msgid "The reservations were rejected"
msgstr "Die Reservationen wurden abgelehnt"

msgid "The reservation was rejected"
msgstr "Die Reservation wurde abgesagt"

msgid "Your reservation was accepted"
msgstr "Ihre Reservation wurde angenommen"
msgid "Your reservations were accepted"
msgstr "Ihre Reservationen wurden angenommen"

#, python-format
msgid ""
Expand Down
2 changes: 1 addition & 1 deletion onegov/town/models/resource.py
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ def request_bound_reservations(self, request, status='pending'):
res = res.filter(Reservation.resource == self.id)
res = res.filter(Reservation.status == status)
res = res.order_by(False) # clear existing order
res = res.order_by(Reservation.id)
res = res.order_by(Reservation.start)

return res

Expand Down
104 changes: 70 additions & 34 deletions onegov/town/models/ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from onegov.libres import Resource
from onegov.ticket import Ticket, Handler, handlers
from onegov.town import _
from onegov.town.elements import DeleteLink, Link
from onegov.town.elements import DeleteLink, Link, LinkGroup
from onegov.town.layout import DefaultLayout, EventLayout
from onegov.town.utils import correct_time_range
from purl import URL
Expand Down Expand Up @@ -135,32 +135,33 @@ def email(self):

@property
def title(self):
if self.resource.type == 'daypass':
template = '{start:%d.%m.%Y} ({quota})'
elif self.resource.type == 'room':
template = '{start:%d.%m.%Y} {start:%H:%M} - {end:%H:%M}'
else:
raise NotImplementedError

parts = []

for ix, reservation in enumerate(self.reservations):
parts.append(
correct_time_range(
template.format(
start=reservation.display_start(),
end=reservation.display_end(),
quota=reservation.quota
)
)
)
parts.append(self.get_reservation_title(reservation))

if ix == 4:
parts.append('…')
break

return ', '.join(parts)

def get_reservation_title(self, reservation):
if self.resource.type == 'daypass':
template = '{start:%d.%m.%Y} ({quota})'
elif self.resource.type == 'room':
template = '{start:%d.%m.%Y} {start:%H:%M} - {end:%H:%M}'
else:
raise NotImplementedError

return correct_time_range(
template.format(
start=reservation.display_start(),
end=reservation.display_end(),
quota=reservation.quota
)
)

@property
def subtitle(self):
if self.submission:
Expand Down Expand Up @@ -223,36 +224,71 @@ def get_links(self, request):

links = []

data = self.reservations[0].data or {}
accepted = tuple(
r.data and r.data.get('accepted') or False
for r in self.reservations
)

if not data.get('accepted'):
if not all(accepted):
link = URL(request.link(self.reservations[0], 'annehmen'))
link = link.query_param('return-to', request.url)

links.append(
Link(
text=_("Accept reservation"),
text=_("Accept all reservations"),
url=link.as_string(),
classes=('accept-link', )
)
)

link = URL(request.link(self.reservations[0], 'absagen'))
link = link.query_param('return-to', request.url)
links.append(
DeleteLink(
text=_("Reject reservation"),
url=link.as_string(),
confirm=_("Do you really want to reject this reservation?"),
extra_information=_(
"Rejecting this reservation can't be undone."
),
yes_button_text=_("Reject reservation"),
request_method='GET',
redirect_after=request.url
)
reject_all_link = URL(request.link(self.reservations[0], 'absagen'))
reject_all_link = reject_all_link.query_param('return-to', request.url)

reject = LinkGroup(
_("Reject reservations"),
[
DeleteLink(
text=_("Reject all"),
url=reject_all_link.as_string(),
confirm=_(
"Do you really want to reject all reservations?"
),
extra_information=_(
"Rejecting these reservations can't be undone."
),
yes_button_text=_("Reject reservations"),
request_method='GET',
redirect_after=request.url
)
],
right_side=False
)

for reservation in self.reservations:
link = URL(request.link(reservation, 'absagen'))
link = link.query_param('reservation-id', reservation.id)
link = link.query_param('return-to', request.url)
title = self.get_reservation_title(reservation)
reject.links.append(
DeleteLink(
text=_("Reject ${title}", mapping={'title': title}),
url=link.as_string(),
confirm=_(
"Do you really want to reject this reservation?"
),
extra_information=_(
"Rejecting ${title} can't be undone.", mapping={
'title': title
}
),
yes_button_text=_("Reject reservation"),
request_method='GET',
redirect_after=request.url
)
)

links.append(reject)

if self.submission:
link = URL(request.link(self.submission))
link = link.query_param('edit', '')
Expand Down
2 changes: 1 addition & 1 deletion onegov/town/templates/macros.pt
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
<div class="edit-bar clearfix">
<tal:block repeat="group layout.editbar_links">
<tal:block condition="group.links|nothing" define="dropdown_id 'editbar-dropdown-{}'.format(repeat.group.number)">
<button href="#" data-dropdown="${dropdown_id}" class="tiny button dropdown">
<button href="#" data-dropdown="${dropdown_id}" class="${group.right_side and 'right-side'} tiny button dropdown">
${group.title}
</button>
<ul id="${dropdown_id}" data-dropdown-content class="f-dropdown">
Expand Down
2 changes: 1 addition & 1 deletion onegov/town/templates/mail_reservation_accepted.pt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</tal:block>
<tal:block metal:fill-slot="body">
<p i18n:translate>Dear Sir or Madam,</p>
<p i18n:translate>Your reservation has been accepted:</p>
<p i18n:translate>The following reservations have been accepted:</p>

<p>${resource.title}</p>
<tal:block metal:use-macro="layout.macros['reservations']"></tal:block>
Expand Down
2 changes: 1 addition & 1 deletion onegov/town/templates/mail_reservation_rejected.pt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
</tal:block>
<tal:block metal:fill-slot="body">
<p i18n:translate>Dear Sir or Madam,</p>
<p i18n:translate>Your reservation has unfortunately been rejected:</p>
<p i18n:translate>The following reservations has unfortunately been rejected:</p>

<p>${resource.title}</p>
<tal:block metal:use-macro="layout.macros['reservations']"></tal:block>
Expand Down
Loading

0 comments on commit ebd14e5

Please sign in to comment.