Skip to content

Commit

Permalink
Enhance event duplication (#547)
Browse files Browse the repository at this point in the history
* Add feedback on event deletion

* Make event duplication methods accept kwargs

* Add EventDuplication controller

* Add action_badge to duplication
  • Loading branch information
janpeterka committed Jul 22, 2023
1 parent da29a1b commit 65a5d2b
Show file tree
Hide file tree
Showing 9 changed files with 99 additions and 21 deletions.
4 changes: 3 additions & 1 deletion app/controllers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@
from .exports.event_cookbook_exporter import EventCookbookExporterView
from .exports.event_timetable_exporter import EventTimetableExporterView


from .events.events import EventView
from .events.share_events import ShareEventView
from .events.published_events import PublishedEventView
from .events.event_duplications import EventDuplicationView
from .event_portion_types import EventPortionTypeView

from .errors import ErrorView
Expand Down Expand Up @@ -53,6 +53,7 @@
"EventView",
"EventCookbookExporterView",
"EventTimetableExporterView",
"EventDuplicationView",
"EventPortionTypeView",
"ShareEventView",
"PublishedEventView",
Expand Down Expand Up @@ -100,6 +101,7 @@ def register_all_controllers(application):
EventExporterView.register(application, base_class=HelperFlaskView)
EventCookbookExporterView.register(application, base_class=HelperFlaskView)
EventTimetableExporterView.register(application, base_class=HelperFlaskView)
EventDuplicationView.register(application, base_class=HelperFlaskView)

ErrorView.register(application)
SupportView.register(application)
Expand Down
40 changes: 40 additions & 0 deletions app/controllers/events/event_duplications.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from flask import redirect, request, flash

# from flask_classful import route
from flask_security import login_required

from app.helpers.helper_flask_view import HelperFlaskView

from app.models import Event
from app.forms import EventForm


class EventDuplicationView(HelperFlaskView):
decorators = [login_required]

def before_request(self, name, id):
self.event = Event.load(id)

def before_new(self, id):
self.validate_show(self.event)

def before_post(self, id):
self.validate_show(self.event)

def new(self, id):
self.form = EventForm(obj=self.event)

return self.template()

def post(self, id):
form = EventForm(request.form)

event = self.event.duplicate(
date_from=form.date_from.data,
name=form.name.data,
people_count=form.people_count.data,
)

flash("událost byla úspěšně zkopírována.", "success")

return redirect(event.url)
5 changes: 4 additions & 1 deletion app/controllers/events/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,10 @@ def update(self, id):

@route("events/delete/<id>", methods=["POST"])
def delete(self, id):
self.event.delete()
if self.event.delete():
flash("událost smazána", "success")
else:
flash("událost nebyla smazána", "error")

return redirect(url_for("EventView:index"))

Expand Down
5 changes: 3 additions & 2 deletions app/models/daily_plans.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ def load_active_by_date_and_event(date, event):
else:
return None

def duplicate(self):
def duplicate(self, event, **kwargs):
daily_plan = DailyPlan()
daily_plan.date = self.date
daily_plan.date = kwargs.get("date", self.date)
daily_plan.event_id = event.id

daily_plan.save()

Expand Down
17 changes: 9 additions & 8 deletions app/models/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,23 +37,24 @@ class Event(BaseModel, BaseMixin, Loggable, Attendable, Collaborative, EventPres
cascade="all, delete",
)

def duplicate(self):
def duplicate(self, **kwargs):
event = Event()

event.name = f"{self.name} (kopie)"
event.date_from = self.date_from
event.date_to = self.date_to
event.name = kwargs.get("name", f"{self.name} (kopie)")
event.date_from = kwargs.get("date_from", self.date_from)

event.people_count = self.people_count
start_date_offset = (event.date_from - self.date_from).days
event.date_to = self.date_to + timedelta(days=start_date_offset)

event.people_count = kwargs.get("people_count", self.people_count)

event.daily_plans = []

event.save()

for old_plan in self.daily_plans:
plan = old_plan.duplicate()
plan.event_id = event.id
plan.edit()
offset_date = old_plan.date + timedelta(days=start_date_offset)
old_plan.duplicate(date=offset_date, event=event)

return event

Expand Down
5 changes: 4 additions & 1 deletion app/presenters/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,10 @@


class EventPresenter(ItemPresenter):
LINK_INFO = {"new": {"value": "přidat akci"}}
LINK_INFO = {
"new": {"value": "přidat akci"},
"duplicate": {"value": "kopírovat akci", "icon": "duplicate"},
}

@property
def duration_label(self) -> str:
Expand Down
30 changes: 30 additions & 0 deletions app/templates/event_duplications/new.html.j2
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{% extends "base/base.html.j2" %}
{% block title %} zkopírovat akce {% endblock %}

{% block content %}

<h1> zkopírovat akci {{link_to(event)}} </h1>

<form method="post" action="{{ url_for('EventDuplicationView:post', id=event.id) }}" accept-charset="UTF-8">
{{ form.hidden_tag() }}

{{ render_floating_field(form.name, class="mb-2") }}

<div class="row mb-2">
<div class="col-md-6 col-sm-12">
<div class="row">
<div class="col-md-6 col-sm-12">{{ render_floating_field(form.date_from) }}</div>
## <div class="col-md-6 col-sm-12 mt-2 mt-md-0">{{ render_floating_field(form.date_to, disabled=True) }}</div>
</div>

</div>
<div class="col-md-6 col-sm-12 mt-2 mt-md-0">
{{ render_floating_field(form.people_count, class="mb-2") }}
</div>
</div>

{{ render_field(form.submit, value="zkopírovat akci") }}
</form>

{% endblock %}

6 changes: 3 additions & 3 deletions app/templates/events/_other_options.html.j2
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<details class="colored mb-2">
<details class="colored mb-2" open>
<summary> další akce </summary>
<div>
<div class="row mb-2">
<div class="row">
<div class="col-12 col-sm-3">
{{ button_to(url_for('EventView:duplicate', id=event.id),
class="btn bg-color-secondary-action color-white w-100", value="zkopírovat " + icon('duplicate')) }}
{{ action_badge("duplicate", event, path=url_for("EventDuplicationView:new", id=event.id), class="w-100") }}

</div>
<div class="col-12 col-sm-3">
</div>
Expand Down
8 changes: 3 additions & 5 deletions app/templates/events/new.html.j2
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

{% block content %}

<form method="post" action="{{ url_for('EventView:post') }}" class="form-group" accept-charset="UTF-8">
{{ form.csrf_token }}
<form method="post" action="{{ url_for('EventView:post') }}" accept-charset="UTF-8">
{{ form.hidden_tag() }}

{{ render_floating_field(form.name, class="mb-2", placeholder="např. Tábor 2023") }}

Expand All @@ -14,16 +14,14 @@
<div class="col-md-6 col-sm-12">{{ render_floating_field(form.date_from) }}</div>
<div class="col-md-6 col-sm-12 mt-2 mt-md-0">{{ render_floating_field(form.date_to) }}</div>
</div>


</div>

<div class="col-md-6 col-sm-12 mt-2 mt-md-0">
{{ render_floating_field(form.people_count, class="mb-2",
placeholder="základní, u jednotlivých jídel je možné změnit") }}
</div>
</div>


{{ render_field(form.submit) }}
</form>

Expand Down

0 comments on commit 65a5d2b

Please sign in to comment.