diff --git a/dav_events/forms/generic.py b/dav_events/forms/generic.py
index 9f8303e..6de15a8 100644
--- a/dav_events/forms/generic.py
+++ b/dav_events/forms/generic.py
@@ -130,3 +130,15 @@ class ModelMixin(object):
if hasattr(model, attr):
kwargs2[attr] = kwargs1[attr]
return model(**kwargs2)
+
+ def load_from_instance(self, instance):
+ model = self._get_model()
+ if not isinstance(instance, model):
+ raise TypeError('Expected %s' % model.__class__.__name__)
+ self.is_bound = True
+ self.data = {}
+ self.cleaned_data = {}
+ for field in instance._meta.get_fields():
+ self.data[field.name] = getattr(instance, field.name)
+ self.cleaned_data[field.name] = getattr(instance, field.name)
+ self._post_clean()
\ No newline at end of file
diff --git a/dav_events/templates/dav_events/event_detail.html b/dav_events/templates/dav_events/event_detail.html
index 3ca485f..0e2db91 100644
--- a/dav_events/templates/dav_events/event_detail.html
+++ b/dav_events/templates/dav_events/event_detail.html
@@ -60,14 +60,12 @@
{% block page-container-fluid %}
-
{% if has_permission_accept %}
diff --git a/dav_events/urls.py b/dav_events/urls.py
index 7813f74..0dd15d3 100644
--- a/dav_events/urls.py
+++ b/dav_events/urls.py
@@ -9,11 +9,12 @@ urlpatterns = [
url(r'^user/password$', views.auth.SetPasswordView.as_view(), name='set_password'),
url(r'^user/password/reset$', views.auth.ResetPasswordView.as_view(), name='reset_password'),
url(r'^events$', views.events.EventListView.as_view(), name='event_list'),
- url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
url(r'^events/export$', views.events.EventListExportView.as_view(), name='event_list_export'),
- url(r'^events/(?P\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
+ url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
+ url(r'^events/(?P\d+)/copy', views.events.EventCopyView.as_view(), name='event_copy'),
url(r'^events/(?P\d+)/confirmpublication',
views.events.EventConfirmPublicationView.as_view(), name='event_confirmpublication'),
+ url(r'^events/(?P\d+)/accept', views.events.EventAcceptView.as_view(), name='event_accept'),
url(r'^events/(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'),
url(r'^events/(?P\d+)/', views.events.EventDetailView.as_view(), name='event_detail'),
url(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/',
diff --git a/dav_events/views/events.py b/dav_events/views/events.py
index 68827ea..dcb7c31 100644
--- a/dav_events/views/events.py
+++ b/dav_events/views/events.py
@@ -220,6 +220,19 @@ class EventUpdateView(EventPermissionMixin, generic.UpdateView):
return super(EventUpdateView, self).dispatch(request, *args, **kwargs)
+class EventCopyView(EventDetailView):
+ permission = 'view'
+ form_class = forms.events.EventCreateForm
+
+ def get(self, request, *args, **kwargs):
+ event = self.get_object()
+ initial_form_name = self.form_class.get_initial_form_name()
+ form_class = getattr(forms.events, initial_form_name)
+ form = form_class(request=self.request)
+ form.load_from_instance(event)
+ return HttpResponseRedirect(reverse('dav_events:event_create'))
+
+
class EventCreateView(generic.FormView):
form_class = forms.events.EventCreateForm
template_dir = os.path.join('dav_events', 'event_create')