general: don't repeat management views in all connectors (#11199)

This commit is contained in:
Frédéric Péters 2016-06-04 18:02:51 +02:00
parent 714a857e55
commit 0b58219f06
84 changed files with 534 additions and 981 deletions

View File

@ -0,0 +1,32 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'passerelle.apps.base_adresse'
label = 'base_adresse'
url_prefix = 'base_adresse'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.BaseAdresse
default_app_config = 'passerelle.apps.base_adresse.AppConfig'

View File

@ -1,15 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import BaseAdresse
class BaseAdresseForm(forms.ModelForm):
class Meta:
model = BaseAdresse
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(BaseAdresseForm, self).save(commit=commit)

View File

@ -19,14 +19,6 @@ class BaseAdresse(BaseResource):
def get_absolute_url(self):
return reverse('base_adresse-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('base_adresse-add')
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'gis'

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'gdc-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,13 +1,19 @@
{% extends "base_adresse/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'base_adresse-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>BaseAddresse - {{ object.title }}</h2>
{% if perms.base_adresse.change_base_adresse %}
<a rel="popup" class="button" href="{% url 'base_adresse-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="base_adresse" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.base_adresse.delete_base_adresse %}
<a rel="popup" class="button" href="{% url 'base_adresse-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="base_adresse" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,8 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from django.conf.urls import patterns, include, url
from passerelle.urls_utils import decorated_includes, required, app_enabled
from views import *
urlpatterns = patterns('',
@ -10,9 +12,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/search/(?P<path>.*)$', SearchPathView.as_view(), name='base_adresse-path-search'),
url(r'^(?P<slug>[\w,-]+)/reverse$', ReverseView.as_view(), name='base_adresse-reverse'),
)
management_urlpatterns = patterns('',
url(r'^add$', BaseAdresseCreateView.as_view(), name='base_adresse-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', BaseAdresseUpdateView.as_view(), name='base_adresse-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', BaseAdresseDeleteView.as_view(), name='base_adresse-delete'),
)

View File

@ -2,20 +2,14 @@ import requests
import urllib
import urlparse
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseBadRequest
from django.shortcuts import redirect
from django.views.generic.base import View, RedirectView
from django.http import HttpResponseBadRequest
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle import utils
from passerelle.base.views import ResourceView
from .models import BaseAdresse
from .forms import BaseAdresseForm
class BaseAdresseDetailView(DetailView):
model = BaseAdresse
@ -26,26 +20,6 @@ class BaseAdresseDetailView(DetailView):
return context
class BaseAdresseCreateView(CreateView):
model = BaseAdresse
form_class = BaseAdresseForm
template_name = 'passerelle/manage/service_form.html'
class BaseAdresseUpdateView(UpdateView):
model = BaseAdresse
form_class = BaseAdresseForm
template_name = 'passerelle/manage/service_form.html'
class BaseAdresseDeleteView(DeleteView):
model = BaseAdresse
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class SearchView(View, SingleObjectMixin):
model = BaseAdresse

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'bdp'
label = 'bdp'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.Bdp
default_app_config = 'bdp.AppConfig'

View File

@ -1,20 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import Bdp
class BdpForm(forms.ModelForm):
class Meta:
model = Bdp
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(BdpForm, self).save(commit=commit)
class BdpUpdateForm(BdpForm):
class Meta:
model = Bdp
exclude = ('users',)

View File

@ -31,14 +31,6 @@ class Bdp(BaseResource):
def get_absolute_url(self):
return reverse('bdp-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('bdp-add')
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'bdp'

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'bdp-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,13 +1,20 @@
{% extends "bdp/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'bdp-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>BDP - {{ object.title }}</h2>
{% if perms.bdp.change_bdp %}
<a rel="popup" class="button" href="{% url 'bdp-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="bdp" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.bdp.delete_bdp %}
<a rel="popup" class="button" href="{% url 'bdp-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="bdp" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,5 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from views import *
urlpatterns = patterns('',
@ -8,9 +7,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/(?P<resources>[\w,-]+)/$', ResourcesView.as_view(), name='bdp-resources'),
url(r'^(?P<slug>[\w,-]+)/post/adherent/$', csrf_exempt(PostAdherentView.as_view()), name='bdp-post-adherent'),
)
management_urlpatterns = patterns('',
url(r'^add$', BdpCreateView.as_view(), name='bdp-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', BdpUpdateView.as_view(), name='bdp-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', BdpDeleteView.as_view(), name='bdp-delete'),
)

View File

@ -1,15 +1,12 @@
import json
from django.core.urlresolvers import reverse
from django.http import Http404
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle import utils
from .models import Bdp
from .forms import BdpForm, BdpUpdateForm
# See documentation:
# https://dev.entrouvert.org/projects/bdp/wiki/WebServices
@ -70,23 +67,3 @@ class PostAdherentView(View, SingleObjectMixin):
class BdpDetailView(DetailView):
model = Bdp
template_name = 'bdp/bdp_detail.html'
class BdpCreateView(CreateView):
model = Bdp
form_class = BdpForm
template_name = 'passerelle/manage/service_form.html'
class BdpUpdateView(UpdateView):
model = Bdp
form_class = BdpUpdateForm
template_name = 'passerelle/manage/service_form.html'
class BdpDeleteView(DeleteView):
model = Bdp
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'choosit'
label = 'choosit'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.ChoositSMSGateway
default_app_config = 'choosit.AppConfig'

View File

@ -1,18 +1,7 @@
from django.utils.text import slugify
from django import forms
from .models import ChoositSMSGateway, ChoositRegisterGateway
class ChoositSMSGatewayForm(forms.ModelForm):
class Meta:
model = ChoositSMSGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(ChoositSMSGatewayForm, self).save(commit=commit)
from .models import ChoositRegisterGateway
class ChoositRegisterGatewayForm(forms.ModelForm):
class Meta:

View File

@ -36,16 +36,6 @@ class ChoositSMSGateway(BaseResource, SMSGatewayMixin):
def get_absolute_url(self):
return reverse('choosit-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('choosit-add')
def get_edit_url(self):
return reverse('choosit-edit', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('choosit-delete', kwargs={'slug': self.slug})
def send(self, text, sender, destinations):
"""Send a SMS using the Choosit provider"""
# from http://sms.choosit.com/documentation_technique.html

View File

@ -9,9 +9,6 @@ urlpatterns = patterns('',
)
management_urlpatterns = patterns('',
url(r'^add$', ChoositCreateView.as_view(), name='choosit-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', ChoositUpdateView.as_view(), name='choosit-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', ChoositDeleteView.as_view(), name='choosit-delete'),
url(r'^register/add$', ChoositRegisterCreateView.as_view(), name='choosit-register-add'),
url(r'^register/(?P<slug>[\w,-]+)/edit$', ChoositRegisterUpdateView.as_view(), name='choosit-register-edit'),
url(r'^register/(?P<slug>[\w,-]+)/delete$', ChoositRegisterDeleteView.as_view(), name='choosit-register-delete'),

View File

@ -11,7 +11,7 @@ from passerelle.sms.views import SendView
from passerelle import utils
from .models import ChoositSMSGateway, ChoositRegisterGateway
from .forms import ChoositSMSGatewayForm, ChoositRegisterGatewayForm
from .forms import ChoositRegisterGatewayForm
class ChoositDetailView(ResourceView):
@ -19,26 +19,6 @@ class ChoositDetailView(ResourceView):
template_name = 'passerelle/manage/messages_service_view.html'
class ChoositCreateView(CreateView):
model = ChoositSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = ChoositSMSGatewayForm
class ChoositUpdateView(UpdateView):
model = ChoositSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = ChoositSMSGatewayForm
class ChoositDeleteView(DeleteView):
model = ChoositSMSGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class ChoositSendView(SendView):
model = ChoositSMSGateway

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'clicrdv'
label = 'clicrdv'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.ClicRdv
default_app_config = 'clicrdv.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import ClicRdv
class ClicRdvForm(forms.ModelForm):
class Meta:
model = ClicRdv
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(ClicRdvForm, self).save(commit=commit)

View File

@ -44,17 +44,6 @@ class ClicRdv(BaseDataSource):
def get_absolute_url(self):
return reverse('clicrdv-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('clicrdv-add')
def get_edit_url(self):
return reverse('clicrdv-edit', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('clicrdv-delete', kwargs={'slug': self.slug})
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@ -63,7 +52,6 @@ class ClicRdv(BaseDataSource):
def get_icon_class(cls):
return 'clock'
def get_request(self, uri):
url = 'https://%s/api/v1/%s' % (self.server, uri)
if '?' in url:

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'clicrdv-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,13 +1,20 @@
{% extends "clicrdv/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'clicrdv-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>ClicRdv - {{ object.title }}</h2>
{% if perms.clicrdv.change_clicrdv %}
<a rel="popup" class="button" href="{% url 'clicrdv-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="clicrdv" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.clicrdv.delete_clicrdv %}
<a rel="popup" class="button" href="{% url 'clicrdv-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="clicrdv" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,8 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from django.conf.urls import patterns, include, url
from passerelle.urls_utils import decorated_includes, required, app_enabled
from views import *
urlpatterns = patterns('',
@ -23,10 +25,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/(?P<appointment_id>\d+)/cancel$',
CancelAppointmentView.as_view(), name='clicrdv-cancel-appointment'),
)
management_urlpatterns = patterns('',
url(r'^add$', ClicRdvCreateView.as_view(), name='clicrdv-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', ClicRdvUpdateView.as_view(), name='clicrdv-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', ClicRdvDeleteView.as_view(), name='clicrdv-delete'),
)

View File

@ -1,43 +1,17 @@
import json
from django.core.urlresolvers import reverse
from django.http import Http404
from django.shortcuts import redirect
from django.views.generic.base import View, RedirectView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle import utils
from passerelle.base.views import ResourceView
from .models import ClicRdv
from .forms import ClicRdvForm
class ClicRdvDetailView(DetailView):
model = ClicRdv
class ClicRdvCreateView(CreateView):
model = ClicRdv
form_class = ClicRdvForm
template_name = 'passerelle/manage/service_form.html'
class ClicRdvUpdateView(UpdateView):
model = ClicRdv
form_class = ClicRdvForm
template_name = 'passerelle/manage/service_form.html'
class ClicRdvDeleteView(DeleteView):
model = ClicRdv
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class InterventionSetsView(View, SingleObjectMixin):
"""list of all sets

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'concerto'
label = 'concerto'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.Concerto
default_app_config = 'concerto.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import Concerto
class ConcertoForm(forms.ModelForm):
class Meta:
model = Concerto
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(ConcertoForm, self).save(commit=commit)

View File

@ -45,20 +45,6 @@ class Concerto(BaseDataSource):
def get_absolute_url(self):
return reverse('concerto-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('concerto-add')
def get_edit_url(self):
return reverse('concerto-edit', kwargs={'slug': self.slug})
def get_delete_url(self):
return reverse('concerto-delete', kwargs={'slug': self.slug})
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'family'

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'concerto-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,13 +1,20 @@
{% extends "concerto/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'concerto-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>Concerto - {{ object.title }}</h2>
{% if perms.concerto.change_concerto %}
<a rel="popup" class="button" href="{% url 'concerto-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="concerto" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.concerto.delete_concerto %}
<a rel="popup" class="button" href="{% url 'concerto-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="concerto" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,4 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from views import *
urlpatterns = patterns('',
@ -21,10 +19,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/invoice/(?P<invoice_id>\w+)/(?P<invoice_hash>\w+)$',
InvoiceView.as_view(), name='concerto-invoiceview'),
)
management_urlpatterns = patterns('',
url(r'^add$', ConcertoCreateView.as_view(), name='concerto-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', ConcertoUpdateView.as_view(), name='concerto-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', ConcertoDeleteView.as_view(), name='concerto-delete'),
)

View File

@ -1,44 +1,16 @@
import json
from django.core.urlresolvers import reverse
from django.http import Http404
from django.shortcuts import redirect
from django.views.generic.base import View, RedirectView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle.utils import to_json
from passerelle import utils
from passerelle.base.views import ResourceView
from .models import Concerto
from .forms import ConcertoForm
class ConcertoDetailView(DetailView):
model = Concerto
class ConcertoCreateView(CreateView):
model = Concerto
form_class = ConcertoForm
template_name = 'passerelle/manage/service_form.html'
class ConcertoUpdateView(UpdateView):
model = Concerto
form_class = ConcertoForm
template_name = 'passerelle/manage/service_form.html'
class ConcertoDeleteView(DeleteView):
model = Concerto
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class FamilyLink(View, SingleObjectMixin):
model = Concerto

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'gdc'
label = 'gdc'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.Gdc
default_app_config = 'gdc.AppConfig'

View File

@ -1,15 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import Gdc
class GdcForm(forms.ModelForm):
class Meta:
model = Gdc
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(GdcForm, self).save(commit=commit)

View File

@ -18,14 +18,6 @@ class Gdc(BaseResource):
def get_absolute_url(self):
return reverse('gdc-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('gdc-add')
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'ressources'

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'gdc-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,16 +0,0 @@
{% extends "gdc/base.html" %}
{% load i18n %}
{% block appbar %}
<h2>GDC - {{ object.title }}</h2>
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
<div class="buttons">
<button>{% trans 'Confirm Deletion' %}</button>
<a class="cancel" href="{{ object.get_absolute_url }}">{% trans 'Cancel' %}</a>
</div>
</form>
{% endblock %}

View File

@ -1,13 +1,20 @@
{% extends "gdc/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'gdc-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>GDC - {{ object.title }}</h2>
{% if perms.gdc.change_gdc %}
<a rel="popup" class="button" href="{% url 'gdc-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="gdc" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.gdc.delete_gdc %}
<a rel="popup" class="button" href="{% url 'gdc-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="gdc" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,35 +0,0 @@
{% extends "gdc/base.html" %}
{% load i18n %}
{% load url from future %}
{% block breadcrumb %}
{{ block.super }}
{% if not object.id %}
<a href="{% url 'gdc-add' %}">{% trans 'Add GDC Connector' %}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>GDC - {% if object.id %}{{ object.title }}{% else %}{% trans 'New' %}{% endif %}</h2>
{% endblock %}
{% block content %}
<form method="post" enctype="multipart/form-data">
<div id="form-content">
{% csrf_token %}
{{ form.as_p }}
</div>
{% block buttons %}
<div class="buttons">
<button>{% trans "Save" %}</button>
{% if object.id %}
<a class="cancel" href="{{ object.get_absolute_url }}">{% trans 'Cancel' %}</a>
{% else %}
<a class="cancel" href="{% url 'add-connector' %}">{% trans 'Cancel' %}</a>
{% endif %}
</div>
{% endblock %}
</form>
{% endblock %}

View File

@ -1,6 +1,5 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from views import *
urlpatterns = patterns('',
@ -12,9 +11,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/post/demande$', csrf_exempt(PostDemandeView.as_view()), name='gdc-post'),
url(r'^(?P<slug>[\w,-]+)/status/(?P<ref>\d+)', StatusView.as_view(), name='gdc-status'),
)
management_urlpatterns = patterns('',
url(r'^add$', GdcCreateView.as_view(), name='gdc-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', GdcUpdateView.as_view(), name='gdc-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', GdcDeleteView.as_view(), name='gdc-delete'),
)

View File

@ -11,18 +11,13 @@ try:
except ImportError:
phpserialize = None
from django.core.urlresolvers import reverse
from django.http import Http404
from django.shortcuts import redirect
from django.views.generic.base import View, RedirectView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle import utils
from passerelle.base.views import ResourceView
from .models import Gdc
from .forms import GdcForm
def phpserialize_loads(s):
if phpserialize is None:
@ -214,20 +209,3 @@ class GdcDetailView(DetailView):
if SOAPpy is None:
context['missing_soappy'] = True
return context
class GdcCreateView(CreateView):
model = Gdc
form_class = GdcForm
class GdcUpdateView(UpdateView):
model = Gdc
form_class = GdcForm
class GdcDeleteView(DeleteView):
model = Gdc
def get_success_url(self):
return reverse('manage-home')

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'mobyt'
label = 'mobyt'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.MobytSMSGateway
default_app_config = 'mobyt.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import MobytSMSGateway
class MobytSMSGatewayForm(forms.ModelForm):
class Meta:
model = MobytSMSGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(MobytSMSGatewayForm, self).save(commit=commit)

View File

@ -37,10 +37,6 @@ class MobytSMSGateway(BaseResource, SMSGatewayMixin):
verbose_name = 'Mobyt'
db_table = 'sms_mobyt'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'phone'
@ -48,15 +44,11 @@ class MobytSMSGateway(BaseResource, SMSGatewayMixin):
def get_absolute_url(self):
return reverse('mobyt-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('mobyt-add')
def get_edit_url(self):
return reverse('mobyt-edit', kwargs={'slug': self.slug})
return reverse('edit-connector', kwargs={'connector': 'mobyt', 'slug': self.slug})
def get_delete_url(self):
return reverse('mobyt-delete', kwargs={'slug': self.slug})
return reverse('delete-connector', kwargs={'connector': 'mobyt', 'slug': self.slug})
def send(self, text, sender, destinations):
"""Send a SMS using the Mobyt provider"""

View File

@ -5,9 +5,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$', MobytDetailView.as_view(), name='mobyt-view'),
url(r'^(?P<slug>[\w,-]+)/send$', MobytSendView.as_view(), name='mobyt-send'),
)
management_urlpatterns = patterns('',
url(r'^add$', MobytCreateView.as_view(), name='mobyt-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', MobytUpdateView.as_view(), name='mobyt-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', MobytDeleteView.as_view(), name='mobyt-delete'),
)

View File

@ -1,11 +1,7 @@
from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle.base.views import ResourceView
from passerelle.sms.views import SendView
from .models import MobytSMSGateway
from .forms import MobytSMSGatewayForm
class MobytDetailView(ResourceView):
@ -13,25 +9,5 @@ class MobytDetailView(ResourceView):
template_name = 'passerelle/manage/messages_service_view.html'
class MobytCreateView(CreateView):
model = MobytSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = MobytSMSGatewayForm
class MobytUpdateView(UpdateView):
model = MobytSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = MobytSMSGatewayForm
class MobytDeleteView(DeleteView):
model = MobytSMSGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class MobytSendView(SendView):
model = MobytSMSGateway

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'orange'
label = 'orange'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.OrangeSMSGateway
default_app_config = 'orange.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import OrangeSMSGateway
class OrangeSMSGatewayForm(forms.ModelForm):
class Meta:
model = OrangeSMSGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(OrangeSMSGatewayForm, self).save(commit=commit)

View File

@ -28,10 +28,6 @@ class OrangeSMSGateway(BaseResource, SMSGatewayMixin):
verbose_name = 'Orange'
db_table = 'sms_orange'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'phone'
@ -39,15 +35,11 @@ class OrangeSMSGateway(BaseResource, SMSGatewayMixin):
def get_absolute_url(self):
return reverse('orange-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('orange-add')
def get_edit_url(self):
return reverse('orange-edit', kwargs={'slug': self.slug})
return reverse('edit-connector', kwargs={'connector': 'orange', 'slug': self.slug})
def get_delete_url(self):
return reverse('orange-delete', kwargs={'slug': self.slug})
return reverse('delete-connector', kwargs={'connector': 'orange', 'slug': self.slug})
def send(self, text, sender, destinations):
logger = logging.getLogger('passerelle.apps.orange')

View File

@ -5,9 +5,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$', OrangeDetailView.as_view(), name='orange-view'),
url(r'^(?P<slug>[\w,-]+)/send$', OrangeSendView.as_view(), name='orange-send'),
)
management_urlpatterns = patterns('',
url(r'^add$', OrangeCreateView.as_view(), name='orange-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', OrangeUpdateView.as_view(), name='orange-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', OrangeDeleteView.as_view(), name='orange-delete'),
)

View File

@ -1,11 +1,7 @@
from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle.base.views import ResourceView
from passerelle.sms.views import SendView
from .models import OrangeSMSGateway
from .forms import OrangeSMSGatewayForm
class OrangeDetailView(ResourceView):
@ -13,25 +9,5 @@ class OrangeDetailView(ResourceView):
template_name = 'passerelle/manage/messages_service_view.html'
class OrangeCreateView(CreateView):
model = OrangeSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OrangeSMSGatewayForm
class OrangeUpdateView(UpdateView):
model = OrangeSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OrangeSMSGatewayForm
class OrangeDeleteView(DeleteView):
model = OrangeSMSGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class OrangeSendView(SendView):
model = OrangeSMSGateway

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'ovh'
label = 'ovh'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.OVHSMSGateway
default_app_config = 'ovh.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import OVHSMSGateway
class OVHSMSGatewayForm(forms.ModelForm):
class Meta:
model = OVHSMSGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(OVHSMSGatewayForm, self).save(commit=commit)

View File

@ -1,6 +1,4 @@
import re
import urllib
import urllib2
import logging
import json
@ -45,10 +43,6 @@ class OVHSMSGateway(BaseResource, SMSGatewayMixin):
verbose_name = 'OVH'
db_table = 'sms_ovh'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'phone'
@ -56,15 +50,11 @@ class OVHSMSGateway(BaseResource, SMSGatewayMixin):
def get_absolute_url(self):
return reverse('ovh-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('ovh-add')
def get_edit_url(self):
return reverse('ovh-edit', kwargs={'slug': self.slug})
return reverse('edit-connector', kwargs={'connector': 'ovh', 'slug': self.slug})
def get_delete_url(self):
return reverse('ovh-delete', kwargs={'slug': self.slug})
return reverse('delete-connector', kwargs={'connector': 'ovh', 'slug': self.slug})
def send(self, text, sender, destinations):
"""Send a SMS using the OVH provider"""

View File

@ -5,9 +5,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$', OvhDetailView.as_view(), name='ovh-view'),
url(r'^(?P<slug>[\w,-]+)/send$', OvhSendView.as_view(), name='ovh-send'),
)
management_urlpatterns = patterns('',
url(r'^add$', OvhCreateView.as_view(), name='ovh-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', OvhUpdateView.as_view(), name='ovh-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', OvhDeleteView.as_view(), name='ovh-delete'),
)

View File

@ -1,11 +1,7 @@
from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle.base.views import ResourceView
from passerelle.sms.views import SendView
from .models import OVHSMSGateway
from .forms import OVHSMSGatewayForm
class OvhDetailView(ResourceView):
@ -13,25 +9,5 @@ class OvhDetailView(ResourceView):
template_name = 'passerelle/manage/messages_service_view.html'
class OvhCreateView(CreateView):
model = OVHSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OVHSMSGatewayForm
class OvhUpdateView(UpdateView):
model = OVHSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OVHSMSGatewayForm
class OvhDeleteView(DeleteView):
model = OVHSMSGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class OvhSendView(SendView):
model = OVHSMSGateway

View File

@ -0,0 +1,31 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'oxyd'
label = 'oxyd'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.OxydSMSGateway
default_app_config = 'oxyd.AppConfig'

View File

@ -1,14 +0,0 @@
from django.utils.text import slugify
from django import forms
from .models import OxydSMSGateway
class OxydSMSGatewayForm(forms.ModelForm):
class Meta:
model = OxydSMSGateway
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(OxydSMSGatewayForm, self).save(commit=commit)

View File

@ -1,8 +1,6 @@
import re
import urllib
import urllib2
import logging
import json
from django.db import models
from django.core.urlresolvers import reverse
@ -27,10 +25,6 @@ class OxydSMSGateway(BaseResource, SMSGatewayMixin):
verbose_name = 'Oxyd'
db_table = 'sms_oxyd'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_icon_class(cls):
return 'phone'
@ -38,15 +32,11 @@ class OxydSMSGateway(BaseResource, SMSGatewayMixin):
def get_absolute_url(self):
return reverse('oxyd-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('oxyd-add')
def get_edit_url(self):
return reverse('oxyd-edit', kwargs={'slug': self.slug})
return reverse('edit-connector', kwargs={'connector': 'oxyd', 'slug': self.slug})
def get_delete_url(self):
return reverse('oxyd-delete', kwargs={'slug': self.slug})
return reverse('delete-connector', kwargs={'connector': 'oxyd', 'slug': self.slug})
def send(self, text, sender, destinations):
"""Send a SMS using the Oxyd provider"""

View File

@ -5,9 +5,3 @@ urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$', OxydDetailView.as_view(), name='oxyd-view'),
url(r'^(?P<slug>[\w,-]+)/send$', OxydSendView.as_view(), name='oxyd-send'),
)
management_urlpatterns = patterns('',
url(r'^add$', OxydCreateView.as_view(), name='oxyd-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', OxydUpdateView.as_view(), name='oxyd-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', OxydDeleteView.as_view(), name='oxyd-delete'),
)

View File

@ -1,11 +1,7 @@
from django.core.urlresolvers import reverse
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from passerelle.base.views import ResourceView
from passerelle.sms.views import SendView
from .models import OxydSMSGateway
from .forms import OxydSMSGatewayForm
class OxydDetailView(ResourceView):
@ -13,25 +9,5 @@ class OxydDetailView(ResourceView):
template_name = 'passerelle/manage/messages_service_view.html'
class OxydCreateView(CreateView):
model = OxydSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OxydSMSGatewayForm
class OxydUpdateView(UpdateView):
model = OxydSMSGateway
template_name = 'passerelle/manage/service_form.html'
form_class = OxydSMSGatewayForm
class OxydDeleteView(DeleteView):
model = OxydSMSGateway
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class OxydSendView(SendView):
model = OxydSMSGateway

View File

@ -0,0 +1,35 @@
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2016 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'pastell'
label = 'pastell'
def get_after_urls(self):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.Pastell
def get_form_class(self):
from . import forms
return forms.PastellForm
default_app_config = 'pastell.AppConfig'

View File

@ -1,19 +1,14 @@
from django.utils.text import slugify
from django import forms
from passerelle.forms import GenericConnectorForm
from .models import Pastell
class PastellForm(forms.ModelForm):
class PastellForm(GenericConnectorForm):
class Meta:
model = Pastell
exclude = ('slug', 'users', 'document_type', 'document_fields')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(PastellForm, self).save(commit=commit)
class PastellTypeForm(forms.ModelForm):
class Meta:

View File

@ -1,8 +0,0 @@
{% extends "passerelle/manage.html" %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'pastell-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}

View File

@ -1,13 +1,20 @@
{% extends "pastell/base.html" %}
{% extends "passerelle/manage.html" %}
{% load i18n passerelle %}
{% block breadcrumb %}
{{ block.super }}
{% if object.id %}
<a href="{% url 'pastell-view' slug=object.slug %}">{{ object.title }}</a>
{% endif %}
{% endblock %}
{% block appbar %}
<h2>Pastell - {{ object.title }}</h2>
{% if perms.pastell.change_pastell %}
<a rel="popup" class="button" href="{% url 'pastell-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="pastell" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.pastell.delete_pastell %}
<a rel="popup" class="button" href="{% url 'pastell-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="pastell" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -1,6 +1,5 @@
from django.views.decorators.csrf import csrf_exempt
from django.conf.urls import patterns, url
from django.contrib.auth.decorators import login_required
from views import *
urlpatterns = patterns('',
@ -10,9 +9,6 @@ urlpatterns = patterns('',
)
management_urlpatterns = patterns('',
url(r'^add$', PastellCreateView.as_view(), name='pastell-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', PastellUpdateView.as_view(), name='pastell-edit'),
url(r'^(?P<slug>[\w,-]+)/type$', PastellTypeView.as_view(), name='pastell-type'),
url(r'^(?P<slug>[\w,-]+)/fields$', PastellFieldsView.as_view(), name='pastell-fields'),
url(r'^(?P<slug>[\w,-]+)/delete$', PastellDeleteView.as_view(), name='pastell-delete'),
)

View File

@ -1,17 +1,14 @@
import json
from django.core.urlresolvers import reverse
from django.http import Http404
from django.shortcuts import redirect
from django.views.generic.base import View, RedirectView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin, DetailView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.views.generic.edit import UpdateView
from passerelle import utils
from passerelle.base.views import ResourceView
from .models import Pastell
from .forms import PastellForm, PastellTypeForm, PastellFieldsForm
from .forms import PastellTypeForm, PastellFieldsForm
class PostView(View, SingleObjectMixin):
model = Pastell
@ -38,26 +35,6 @@ class PastellDetailView(DetailView):
return context
class PastellCreateView(CreateView):
model = Pastell
form_class = PastellForm
template_name = 'passerelle/manage/service_form.html'
class PastellUpdateView(UpdateView):
model = Pastell
form_class = PastellForm
template_name = 'passerelle/manage/service_form.html'
class PastellDeleteView(DeleteView):
model = Pastell
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class PastellTypeView(UpdateView):
model = Pastell
form_class = PastellTypeForm

View File

@ -2,6 +2,7 @@ import logging
from django.conf import settings
from django.core.exceptions import ValidationError, ObjectDoesNotExist
from django.core.urlresolvers import reverse
from django.db import models
from django.db.models import Q
from django.utils.translation import ugettext_lazy as _
@ -124,6 +125,18 @@ class BaseResource(models.Model):
def requests(self):
return passerelle.utils.LoggedRequest(logger=self.logger)
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
@classmethod
def get_connector_slug(cls):
return cls._meta.app_label.replace('_', '-')
@classmethod
def get_add_url(cls):
return reverse('create-connector', kwargs={'connector': cls.get_connector_slug()})
class AccessRight(models.Model):
codename = models.CharField(max_length=100, verbose_name='codename')

View File

@ -24,4 +24,8 @@ class AppConfig(django.apps.AppConfig):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.StubInvoicesConnector
default_app_config = 'passerelle.contrib.stub_invoices.AppConfig'

View File

@ -36,17 +36,9 @@ class StubInvoicesConnector(BaseResource):
def get_icon_class(cls):
return 'ressources'
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
def get_absolute_url(self):
return reverse('stub-invoices-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('stub-invoices-add')
# generate a serie of stub invoices
invoices = {}
for i in range(15):

View File

@ -10,11 +10,11 @@
{% block appbar %}
<h2>Stub Invoices - {{ object.title }}</h2>
{% if perms.teamnet_axel.change_teamnet_axel %}
<a rel="popup" class="button" href="{% url 'stub-invoices-edit' slug=object.slug %}">{% trans 'edit' %}</a>
{% if perms.stub_invoices.change_stub_invoice_connector %}
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="stub-invoices" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.teamnet_axel.delete_teamnet_axel %}
<a rel="popup" class="button" href="{% url 'stub-invoices-delete' slug=object.slug %}">{% trans 'delete' %}</a>
{% if perms.stub_invoices.delete_stub_invoice_connector %}
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="stub-invoices" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -16,13 +16,12 @@
from django.conf.urls import patterns, include, url
from passerelle.urls_utils import decorated_includes, required, app_enabled
from django.contrib.auth.decorators import login_required
from .views import *
public_urlpatterns = patterns('',
urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$', StubInvoicesConnectorDetailView.as_view(),
name='stub-invoices-view'),
url(r'^(?P<slug>[\w,-]+)/invoices/history/$', HistoryInvoicesView.as_view(),
@ -37,21 +36,3 @@ public_urlpatterns = patterns('',
InvoicePayView.as_view(),
name='stub-invoices-invoice-payment'),
)
management_urlpatterns = patterns('',
url(r'^add$', StubInvoicesConnectorCreateView.as_view(),
name='stub-invoices-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', StubInvoicesConnectorUpdateView.as_view(),
name='stub-invoices-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', StubInvoicesConnectorDeleteView.as_view(),
name='stub-invoices-delete'),
)
urlpatterns = required(
app_enabled('stub_invoices'),
patterns('',
url(r'^stub-invoices/', include(public_urlpatterns)),
url(r'^manage/stub-invoices/',
decorated_includes(login_required, include(management_urlpatterns))),
)
)

View File

@ -26,7 +26,6 @@ from django.http import HttpResponse, Http404
from passerelle import utils
from .models import StubInvoicesConnector
from .forms import StubInvoicesConnectorForm
class StubInvoicesConnectorDetailView(DetailView):
@ -34,26 +33,6 @@ class StubInvoicesConnectorDetailView(DetailView):
template_name = 'passerelle/stub-invoices/detail.html'
class StubInvoicesConnectorCreateView(CreateView):
model = StubInvoicesConnector
form_class = StubInvoicesConnectorForm
template_name = 'passerelle/manage/service_form.html'
class StubInvoicesConnectorUpdateView(UpdateView):
model = StubInvoicesConnector
form_class = StubInvoicesConnectorForm
template_name = 'passerelle/manage/service_form.html'
class StubInvoicesConnectorDeleteView(DeleteView):
model = StubInvoicesConnector
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class InvoicesView(DetailView):
model = StubInvoicesConnector

View File

@ -1,4 +1,4 @@
# passerelle.contrib.tlmcom
# passerelle - uniform access to multiple data sources and services
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
@ -24,4 +24,8 @@ class AppConfig(django.apps.AppConfig):
from . import urls
return urls.urlpatterns
def get_connector_model(self):
from . import models
return models.TlmCom
default_app_config = 'passerelle.contrib.tlmcom.AppConfig'

View File

@ -1,35 +0,0 @@
# passerelle.contrib.tlmcom.
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.utils.text import slugify
from django import forms
from .models import TlmCom
class TlmComForm(forms.ModelForm):
class Meta:
model = TlmCom
exclude = ('slug', 'users')
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(TlmComForm, self).save(commit=commit)
class TlmComUpdateForm(TlmComForm):
class Meta:
model = TlmCom
exclude = ('users',)

View File

@ -5,17 +5,9 @@ from django.utils.translation import ugettext_lazy as _
class TlmCom(PBXMixin):
@classmethod
def get_verbose_name(cls):
return cls._meta.verbose_name
def get_absolute_url(self):
return reverse('tlmcom-view', kwargs={'slug': self.slug})
@classmethod
def get_add_url(cls):
return reverse('tlmcom-add')
class Meta:
verbose_name = _('TLM COM PBX')
verbose_name_plural = _('TLM COM PBX')

View File

@ -11,10 +11,10 @@
{% block appbar %}
<h2>TlmCom - {{ object.title }}</h2>
{% if perms.tlmcom.change_tlmcom %}
<a rel="popup" class="button" href="{% url 'tlmcom-edit' slug=object.slug %}">{% trans 'edit' %}</a>
<a rel="popup" class="button" href="{% url 'edit-connector' slug=object.slug connector="tlmcom" %}">{% trans 'edit' %}</a>
{% endif %}
{% if perms.tlmcom.delete_tlmcom %}
<a rel="popup" class="button" href="{% url 'tlmcom-delete' slug=object.slug %}">{% trans 'delete' %}</a>
<a rel="popup" class="button" href="{% url 'delete-connector' slug=object.slug connector="tlmcom" %}">{% trans 'delete' %}</a>
{% endif %}
{% endblock %}

View File

@ -14,37 +14,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf.urls import patterns, include, url
from passerelle.urls_utils import decorated_includes, required, app_enabled
from django.contrib.auth.decorators import login_required
from django.conf.urls import patterns, url
from .views import TlmComDetailView, CallStart, CallStop
from .views import (TlmComDetailView, CallStart, CallStop, TlmComCreateView,
TlmComUpdateView, TlmComDeleteView)
public_urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$',
TlmComDetailView.as_view(), name='tlmcom-view'),
url(r'^(?P<slug>[\w,-]+)/call-start/$',
CallStart.as_view(),
name='tlmcom-call-start'),
url(r'^(?P<slug>[\w,-]+)/call-stop/$',
CallStop.as_view(), name='tlmcom-call-stop'),
)
management_urlpatterns = patterns('',
url(r'^add$', TlmComCreateView.as_view(),
name='tlmcom-add'),
url(r'^(?P<slug>[\w,-]+)/edit$', TlmComUpdateView.as_view(),
name='tlmcom-edit'),
url(r'^(?P<slug>[\w,-]+)/delete$', TlmComDeleteView.as_view(),
name='tlmcom-delete'),
)
urlpatterns = required(
app_enabled('tlmcom'),
patterns('',
url(r'^tlmcom/', include(public_urlpatterns)),
url(r'^manage/tlmcom/',
decorated_includes(login_required, include(management_urlpatterns))),
)
urlpatterns = patterns('',
url(r'^(?P<slug>[\w,-]+)/$',
TlmComDetailView.as_view(), name='tlmcom-view'),
url(r'^(?P<slug>[\w,-]+)/call-start/$',
CallStart.as_view(), name='tlmcom-call-start'),
url(r'^(?P<slug>[\w,-]+)/call-stop/$',
CallStop.as_view(), name='tlmcom-call-stop'),
)

View File

@ -14,42 +14,19 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.core.urlresolvers import reverse
from django.views.generic import DetailView as GenericDetailView
from django.views.generic import DetailView
from django.views.generic.base import View
from django.views.generic.detail import SingleObjectMixin
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from django.http import HttpResponse, HttpResponseBadRequest
from .models import TlmCom
from .forms import TlmComForm, TlmComUpdateForm
class TlmComDetailView(GenericDetailView):
class TlmComDetailView(DetailView):
model = TlmCom
template_name = 'passerelle/contrib/tlmcom/detail.html'
class TlmComCreateView(CreateView):
model = TlmCom
form_class = TlmComForm
template_name = 'passerelle/manage/service_form.html'
class TlmComUpdateView(UpdateView):
model = TlmCom
form_class = TlmComUpdateForm
template_name = 'passerelle/manage/service_form.html'
class TlmComDeleteView(DeleteView):
model = TlmCom
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
class CallStart(SingleObjectMixin, View):
event = 'start'
model = TlmCom

View File

@ -17,14 +17,8 @@
from django.utils.text import slugify
from django import forms
from .models import StubInvoicesConnector
class StubInvoicesConnectorForm(forms.ModelForm):
class Meta:
model = StubInvoicesConnector
exclude = ('slug', 'users')
class GenericConnectorForm(forms.ModelForm):
def save(self, commit=True):
if not self.instance.slug:
self.instance.slug = slugify(self.instance.title)
return super(StubInvoicesConnectorForm, self).save(commit=commit)
return super(GenericConnectorForm, self).save(commit=commit)

View File

@ -17,6 +17,8 @@
from django.apps import apps
from django.conf.urls import patterns, include, url
from .urls_utils import decorated_includes, required, app_enabled
def register_apps_urls(urlpatterns):
'''Call get_before_urls and get_after_urls on all apps providing them,
@ -25,14 +27,17 @@ def register_apps_urls(urlpatterns):
before_urls = []
after_urls = []
for app in apps.get_app_configs():
url_prefix = '^%s/' % getattr(app, 'url_prefix', app.label.replace('_', '-'))
if hasattr(app, 'get_before_urls'):
urls = app.get_before_urls()
if urls:
before_urls.append(url('^', include(urls)))
urls = required(app_enabled(app.label), urls)
before_urls.append(url(url_prefix, include(urls)))
if hasattr(app, 'get_after_urls'):
urls = app.get_after_urls()
if urls:
after_urls.append(url('^', include(urls)))
urls = required(app_enabled(app.label), urls)
after_urls.append(url(url_prefix, include(urls)))
before_patterns = patterns('', *before_urls)
after_patterns = patterns('', *after_urls)
return before_patterns + urlpatterns + after_patterns

View File

@ -7,22 +7,15 @@ from django.contrib.auth.decorators import login_required
from django.views.static import serve as static_serve
from .views import (HomePageView, ManageView, ManageAddView,
GenericCreateConnectorView, GenericDeleteConnectorView,
GenericEditConnectorView,
LEGACY_APPS_PATTERNS, LegacyPageView, login, logout)
from .urls_utils import decorated_includes, required, app_enabled
from .base.urls import access_urlpatterns
from .plugins import register_apps_urls
import choosit.urls
import clicrdv.urls
import gdc.urls
import mobyt.urls
import ovh.urls
import oxyd.urls
import pastell.urls
import concerto.urls
import bdp.urls
import base_adresse.urls
import orange.urls
admin.autodiscover()
@ -51,96 +44,14 @@ urlpatterns += required(
)
)
urlpatterns += required(
app_enabled('clicrdv'),
patterns('',
url(r'^clicrdv/', include(clicrdv.urls.urlpatterns)),
url(r'^manage/clicrdv/',
decorated_includes(login_required, include(clicrdv.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('gdc'),
patterns('',
url(r'^gdc/', include(gdc.urls.urlpatterns)),
url(r'^manage/gdc/',
decorated_includes(login_required, include(gdc.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('mobyt'),
patterns('',
url(r'^mobyt/', include(mobyt.urls.urlpatterns)),
url(r'^manage/mobyt/',
decorated_includes(login_required, include(mobyt.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('ovh'),
patterns('',
url(r'^ovh/', include(ovh.urls.urlpatterns)),
url(r'^manage/ovh/',
decorated_includes(login_required, include(ovh.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('oxyd'),
patterns('',
url(r'^oxyd/', include(oxyd.urls.urlpatterns)),
url(r'^manage/oxyd/',
decorated_includes(login_required, include(oxyd.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('pastell'),
patterns('',
url(r'^pastell/', include(pastell.urls.urlpatterns)),
url(r'^manage/pastell/',
decorated_includes(login_required, include(pastell.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('concerto'),
patterns('',
url(r'^concerto/', include(concerto.urls.urlpatterns)),
url(r'^manage/concerto/',
decorated_includes(login_required, include(concerto.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('bdp'),
patterns('',
url(r'^bdp/', include(bdp.urls.urlpatterns)),
url(r'^manage/bdp/',
decorated_includes(login_required, include(bdp.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('base_adresse'),
patterns('',
url(r'^base_adresse/', include(base_adresse.urls.urlpatterns)),
url(r'^manage/base_adresse/',
decorated_includes(login_required, include(base_adresse.urls.management_urlpatterns))),
)
)
urlpatterns += required(
app_enabled('orange'),
patterns('',
url(r'^orange/', include(orange.urls.urlpatterns)),
url(r'^manage/orange/',
decorated_includes(login_required, include(orange.urls.management_urlpatterns))),
)
)
# add patterns from apps
urlpatterns = register_apps_urls(urlpatterns)
@ -162,5 +73,16 @@ for app, d in LEGACY_APPS_PATTERNS.items():
{'resource_name': d['name']}),
)
urlpatterns += patterns('',
url(r'^manage/(?P<connector>[\w,-]+)/', decorated_includes(login_required,
include(patterns('',
url(r'^add$',
GenericCreateConnectorView.as_view(), name='create-connector'),
url(r'^(?P<slug>[\w,-]+)/delete$',
GenericDeleteConnectorView.as_view(), name='delete-connector'),
url(r'^(?P<slug>[\w,-]+)/edit$',
GenericEditConnectorView.as_view(), name='edit-connector'),
)))))
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
urlpatterns += staticfiles_urlpatterns()

View File

@ -1,15 +1,14 @@
import json
from django.apps import apps
from django.contrib.auth import logout as auth_logout
from django.contrib.auth import views as auth_views
from django.http import HttpResponseRedirect, HttpResponse
from django.views.generic.base import RedirectView, TemplateView
from django.http import HttpResponseRedirect, Http404
from django.views.generic import RedirectView, TemplateView, CreateView, DeleteView, UpdateView
from django.conf import settings
from django.db import models
from django.shortcuts import resolve_url
from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import force_text
from django.forms.models import modelform_factory
try:
from mellon.utils import get_idps
@ -18,6 +17,8 @@ except ImportError:
from passerelle.base.models import BaseResource
from .forms import GenericConnectorForm
def get_all_apps():
return [x for x in models.get_models() if issubclass(x, BaseResource) and \
@ -66,6 +67,38 @@ class ManageAddView(TemplateView):
return context
class GenericConnectorMixin(object):
def dispatch(self, request, *args, **kwargs):
connector = kwargs.get('connector')
try:
app = apps.get_app_config(connector.replace('-', '_'))
except LookupError:
raise Http404()
self.model = app.get_connector_model()
if hasattr(app, 'get_form_class'):
self.form_class = app.get_form_class()
else:
self.form_class = modelform_factory(self.model,
form=GenericConnectorForm, exclude=('slug', 'users'))
return super(GenericConnectorMixin, self).dispatch(
request, *args, **kwargs)
class GenericCreateConnectorView(GenericConnectorMixin, CreateView):
template_name = 'passerelle/manage/service_form.html'
class GenericEditConnectorView(GenericConnectorMixin, UpdateView):
template_name = 'passerelle/manage/service_form.html'
class GenericDeleteConnectorView(GenericConnectorMixin, DeleteView):
template_name = 'passerelle/manage/service_confirm_delete.html'
def get_success_url(self):
return reverse('manage-home')
# legacy
LEGACY_APPS_PATTERNS = {
'datasources': {'url': 'data', 'name': 'Data Sources'},