agendas: manager views for resources (#38942)
This commit is contained in:
parent
c62ebc9b56
commit
a06c7796c8
|
@ -35,6 +35,7 @@ from chrono.agendas.models import (
|
|||
TimePeriodException,
|
||||
TimePeriodExceptionSource,
|
||||
VirtualMember,
|
||||
Resource,
|
||||
WEEKDAYS_LIST,
|
||||
)
|
||||
|
||||
|
@ -67,6 +68,18 @@ class AgendaEditForm(AgendaAddForm):
|
|||
self.fields['maximal_booking_delay'].required = True
|
||||
|
||||
|
||||
class ResourceAddForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Resource
|
||||
fields = ['label', 'description']
|
||||
|
||||
|
||||
class ResourceEditForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Resource
|
||||
fields = ['label', 'slug', 'description']
|
||||
|
||||
|
||||
class NewEventForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = Event
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
<h2>{% trans 'Agendas' %}</h2>
|
||||
{% if user.is_staff %}
|
||||
<span class="actions">
|
||||
<a href="{% url 'chrono-manager-resource-list' %}">{% trans 'Resources' %}</a>
|
||||
<a rel="popup" href="{% url 'chrono-manager-agendas-import' %}">{% trans 'Import' %}</a>
|
||||
<a rel="popup" href="{% url 'chrono-manager-agenda-add' %}">{% trans 'New' %}</a>
|
||||
</span>
|
||||
|
@ -17,7 +18,7 @@
|
|||
<div>
|
||||
<ul class="objects-list single-links">
|
||||
{% for object in object_list %}
|
||||
<li><a href="{% url 'chrono-manager-agenda-view' pk=object.id %}">{{ object.label }}</li>
|
||||
<li><a href="{% url 'chrono-manager-agenda-view' pk=object.id %}">{{ object.label }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
{% extends "chrono/manager_resource_list.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block page-title-extra-label %}
|
||||
- {{ object.label }}
|
||||
{% endblock %}
|
||||
|
||||
{% block breadcrumb %}
|
||||
{{ block.super }}
|
||||
<a href="{% url 'chrono-manager-resource-view' pk=object.pk %}">{{ object }}</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block appbar %}
|
||||
<h2>{{ object }}</h2>
|
||||
<span class="actions">
|
||||
<a rel="popup" href="{% url 'chrono-manager-resource-edit' pk=object.pk %}">{% trans 'Edit' %}</a>
|
||||
<a rel="popup" href="{% url 'chrono-manager-resource-delete' pk=object.pk %}">{% trans 'Delete' %}</a>
|
||||
</span>
|
||||
{% endblock %}
|
|
@ -0,0 +1,22 @@
|
|||
{% extends "chrono/manager_home.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block appbar %}
|
||||
{% if object.id %}
|
||||
<h2>{% trans "Edit Resource" %}</h2>
|
||||
{% else %}
|
||||
<h2>{% trans "New Resource" %}</h2>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<form method="post" enctype="multipart/form-data">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<div class="buttons">
|
||||
<button class="submit-button">{% trans "Save" %}</button>
|
||||
<a class="cancel" href="{% url 'chrono-manager-resource-list' %}">{% trans 'Cancel' %}</a>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -0,0 +1,36 @@
|
|||
{% extends "chrono/manager_base.html" %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block breadcrumb %}
|
||||
{{ block.super }}
|
||||
<a href="{% url 'chrono-manager-resource-list' %}">{% trans "Resources" %}</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block appbar %}
|
||||
<h2>{% trans 'Resources' %}</h2>
|
||||
<span class="actions">
|
||||
<a rel="popup" href="{% url 'chrono-manager-resource-add' %}">{% trans 'New' %}</a>
|
||||
</span>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
{% block content %}
|
||||
{% if object_list %}
|
||||
<div>
|
||||
<ul class="objects-list single-links">
|
||||
{% for object in object_list %}
|
||||
<li>
|
||||
<a href="{% url 'chrono-manager-resource-view' pk=object.pk %}">{{ object.label }} ({{ object.slug }})</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="big-msg-info">
|
||||
{% blocktrans %}
|
||||
This site doesn't have any resource yet. Click on the "New" button in the top
|
||||
right of the page to add a first one.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
|
@ -20,6 +20,11 @@ from . import views
|
|||
|
||||
urlpatterns = [
|
||||
url(r'^$', views.homepage, name='chrono-manager-homepage'),
|
||||
url(r'^resources/$', views.resource_list, name='chrono-manager-resource-list'),
|
||||
url(r'^resource/add/$', views.resource_add, name='chrono-manager-resource-add'),
|
||||
url(r'^resource/(?P<pk>\d+)/$', views.resource_view, name='chrono-manager-resource-view'),
|
||||
url(r'^resource/(?P<pk>\d+)/edit/$', views.resource_edit, name='chrono-manager-resource-edit'),
|
||||
url(r'^resource/(?P<pk>\d+)/delete/$', views.resource_delete, name='chrono-manager-resource-delete'),
|
||||
url(r'^agendas/add/$', views.agenda_add, name='chrono-manager-agenda-add'),
|
||||
url(r'^agendas/import/$', views.agendas_import, name='chrono-manager-agendas-import'),
|
||||
url(r'^agendas/(?P<pk>\d+)/$', views.agenda_view, name='chrono-manager-agenda-view'),
|
||||
|
|
|
@ -57,6 +57,7 @@ from chrono.agendas.models import (
|
|||
AgendaImportError,
|
||||
TimePeriodExceptionSource,
|
||||
VirtualMember,
|
||||
Resource,
|
||||
)
|
||||
|
||||
from .forms import (
|
||||
|
@ -76,6 +77,8 @@ from .forms import (
|
|||
TimePeriodAddForm,
|
||||
TimePeriodExceptionSourceReplaceForm,
|
||||
VirtualMemberForm,
|
||||
ResourceAddForm,
|
||||
ResourceEditForm,
|
||||
)
|
||||
from .utils import import_site
|
||||
|
||||
|
@ -97,6 +100,57 @@ class HomepageView(ListView):
|
|||
homepage = HomepageView.as_view()
|
||||
|
||||
|
||||
class ResourceListView(ListView):
|
||||
template_name = 'chrono/manager_resource_list.html'
|
||||
model = Resource
|
||||
|
||||
|
||||
resource_list = ResourceListView.as_view()
|
||||
|
||||
|
||||
class ResourceDetailView(DetailView):
|
||||
template_name = 'chrono/manager_resource_detail.html'
|
||||
model = Resource
|
||||
|
||||
|
||||
resource_view = ResourceDetailView.as_view()
|
||||
|
||||
|
||||
class ResourceAddView(CreateView):
|
||||
template_name = 'chrono/manager_resource_form.html'
|
||||
model = Resource
|
||||
form_class = ResourceAddForm
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('chrono-manager-resource-view', kwargs={'pk': self.object.id})
|
||||
|
||||
|
||||
resource_add = ResourceAddView.as_view()
|
||||
|
||||
|
||||
class ResourceEditView(UpdateView):
|
||||
template_name = 'chrono/manager_resource_form.html'
|
||||
model = Resource
|
||||
form_class = ResourceEditForm
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('chrono-manager-resource-view', kwargs={'pk': self.object.id})
|
||||
|
||||
|
||||
resource_edit = ResourceEditView.as_view()
|
||||
|
||||
|
||||
class ResourceDeleteView(DeleteView):
|
||||
template_name = 'chrono/manager_confirm_delete.html'
|
||||
model = Resource
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse('chrono-manager-resource-list')
|
||||
|
||||
|
||||
resource_delete = ResourceDeleteView.as_view()
|
||||
|
||||
|
||||
class AgendaAddView(CreateView):
|
||||
template_name = 'chrono/manager_agenda_form.html'
|
||||
model = Agenda
|
||||
|
|
|
@ -6,7 +6,6 @@ import datetime
|
|||
import json
|
||||
import mock
|
||||
import os
|
||||
import re
|
||||
|
||||
from django.contrib.auth.models import User, Group
|
||||
from django.db import connection
|
||||
|
@ -25,6 +24,7 @@ from chrono.agendas.models import (
|
|||
Desk,
|
||||
Event,
|
||||
MeetingType,
|
||||
Resource,
|
||||
TimePeriod,
|
||||
TimePeriodException,
|
||||
TimePeriodExceptionSource,
|
||||
|
@ -180,6 +180,45 @@ def test_view_agendas_as_manager(app, manager_user):
|
|||
resp = app.get('/manage/agendas/%s/settings' % '9999', status=404)
|
||||
|
||||
|
||||
def test_add_resource(app, admin_user):
|
||||
app = login(app)
|
||||
resp = app.get('/manage/', status=200)
|
||||
resp = resp.click('Resources')
|
||||
resp = resp.click('New')
|
||||
resp.form['label'] = 'Foo bar'
|
||||
resp = resp.form.submit()
|
||||
resource = Resource.objects.latest('pk')
|
||||
assert resp.location.endswith('/manage/resource/%s/' % resource.pk)
|
||||
assert resource.label == 'Foo bar'
|
||||
assert resource.slug == 'foo-bar'
|
||||
|
||||
|
||||
def test_edit_resource(app, admin_user):
|
||||
resource = Resource.objects.create(label='Foo bar')
|
||||
|
||||
app = login(app)
|
||||
resp = app.get('/manage/resource/%s/' % resource.pk, status=200)
|
||||
resp = resp.click('Edit')
|
||||
resp.form['label'] = 'Foo bar baz'
|
||||
resp.form['slug'] = 'baz'
|
||||
resp = resp.form.submit()
|
||||
assert resp.location.endswith('/manage/resource/%s/' % resource.pk)
|
||||
resource.refresh_from_db()
|
||||
assert resource.label == 'Foo bar baz'
|
||||
assert resource.slug == 'baz'
|
||||
|
||||
|
||||
def test_delete_resource(app, admin_user):
|
||||
resource = Resource.objects.create(label='Foo bar')
|
||||
|
||||
app = login(app)
|
||||
resp = app.get('/manage/resource/%s/' % resource.pk, status=200)
|
||||
resp = resp.click('Delete')
|
||||
resp = resp.form.submit()
|
||||
assert resp.location.endswith('/manage/resources/')
|
||||
assert Resource.objects.exists() is False
|
||||
|
||||
|
||||
def test_add_agenda(app, admin_user):
|
||||
app = login(app)
|
||||
resp = app.get('/manage/', status=200)
|
||||
|
|
Loading…
Reference in New Issue