diff --git a/passerelle_montpellier_encombrants/__init__.py b/passerelle_montpellier_encombrants/__init__.py index 0b8e595..f1a0cf8 100644 --- a/passerelle_montpellier_encombrants/__init__.py +++ b/passerelle_montpellier_encombrants/__init__.py @@ -16,11 +16,14 @@ import django.apps + class AppConfig(django.apps.AppConfig): name = 'passerelle_montpellier_encombrants' def get_after_urls(self): from . import urls + return urls.urlpatterns + default_app_config = 'passerelle_montpellier_encombrants.AppConfig' diff --git a/passerelle_montpellier_encombrants/forms.py b/passerelle_montpellier_encombrants/forms.py index 34f3f85..ceb73aa 100644 --- a/passerelle_montpellier_encombrants/forms.py +++ b/passerelle_montpellier_encombrants/forms.py @@ -36,9 +36,7 @@ class ListValidator(object): class CommaSeparatedEmailField(forms.Field): - - def __init__(self, dedup=True, max_length=None, min_length=None, *args, - **kwargs): + def __init__(self, dedup=True, max_length=None, min_length=None, *args, **kwargs): self.dedup = dedup self.max_length = max_length self.min_length = min_length @@ -64,7 +62,6 @@ class CommaSeparatedEmailField(forms.Field): class EncombrantsManagementForm(forms.ModelForm): - class Meta: model = EncombrantsManagement exclude = ('slug', 'users') @@ -74,6 +71,7 @@ class EncombrantsManagementForm(forms.ModelForm): self.instance.slug = slugify(self.instance.title) return super(EncombrantsManagementForm, self).save(commit=commit) + class EncombrantsManagementUpdateForm(EncombrantsManagementForm): class Meta: model = EncombrantsManagement @@ -87,9 +85,11 @@ class NoStreetsCommuneForm(forms.ModelForm): class CommuneForm(forms.ModelForm): - streets = forms.CharField(widget=forms.Textarea(attrs={'cols': 25, 'rows': 10}), - help_text=_('one street by line'), - required=False) + streets = forms.CharField( + widget=forms.Textarea(attrs={'cols': 25, 'rows': 10}), + help_text=_('one street by line'), + required=False, + ) class Meta: model = Commune @@ -106,15 +106,18 @@ class CommuneForm(forms.ModelForm): class SectorForm(forms.ModelForm): - contact_email = CommaSeparatedEmailField(label=_('Emails'), - required=False, - help_text=_('separated by commas')) + contact_email = CommaSeparatedEmailField( + label=_('Emails'), required=False, help_text=_('separated by commas') + ) + class Meta: model = Sector fields = '__all__' class StreetsForm(forms.Form): - streets = forms.CharField(widget=forms.Textarea(attrs={'cols': 25, 'rows': 10}), - help_text=_('one street by line'), - required=False) + streets = forms.CharField( + widget=forms.Textarea(attrs={'cols': 25, 'rows': 10}), + help_text=_('one street by line'), + required=False, + ) diff --git a/passerelle_montpellier_encombrants/management/commands/notify_sectors.py b/passerelle_montpellier_encombrants/management/commands/notify_sectors.py index 7f369f9..2264ca5 100644 --- a/passerelle_montpellier_encombrants/management/commands/notify_sectors.py +++ b/passerelle_montpellier_encombrants/management/commands/notify_sectors.py @@ -12,13 +12,12 @@ from passerelle_montpellier_encombrants.utils import email_sectors class Command(BaseCommand): - def get(self, url, sign=False): api_user = getattr(settings, 'ENCOMBRANTS_API_USER') secret = getattr(settings, 'ENCOMBRANTS_API_SECRET') orig = getattr(settings, 'ENCOMBRANTS_API_ORIG') if sign: - url = sign_url(url + '&email=' + urllib.quote(api_user), secret) + '&orig='+urllib.quote(orig) + url = sign_url(url + '&email=' + urllib.quote(api_user), secret) + '&orig=' + urllib.quote(orig) return requests.get(url, headers={'Accept': 'application/json'}) def handle(self, *args, **kwargs): @@ -39,5 +38,7 @@ class Command(BaseCommand): response = r.json() if 'err' in response: raise CommandError('Error while retrieving formdefs: %s' % r.json()) - response = [x for x in response if x.get('workflow', {}).get('status', {}).get('name') != u'Annulé'] + response = [ + x for x in response if x.get('workflow', {}).get('status', {}).get('name') != u'Annulé' + ] email_sectors(response, tomorrow) diff --git a/passerelle_montpellier_encombrants/migrations/0001_initial.py b/passerelle_montpellier_encombrants/migrations/0001_initial.py index 844f4cc..bb8b9c8 100644 --- a/passerelle_montpellier_encombrants/migrations/0001_initial.py +++ b/passerelle_montpellier_encombrants/migrations/0001_initial.py @@ -14,7 +14,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='EncombrantsManagement', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', + models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True), + ), ('title', models.CharField(verbose_name='Title', max_length=50)), ('slug', models.SlugField(verbose_name='Identifier', unique=True)), ('description', models.TextField(verbose_name='Description')), diff --git a/passerelle_montpellier_encombrants/migrations/0002_auto_20150413_0629.py b/passerelle_montpellier_encombrants/migrations/0002_auto_20150413_0629.py index 885a0f8..0b10786 100644 --- a/passerelle_montpellier_encombrants/migrations/0002_auto_20150413_0629.py +++ b/passerelle_montpellier_encombrants/migrations/0002_auto_20150413_0629.py @@ -14,7 +14,10 @@ class Migration(migrations.Migration): migrations.CreateModel( name='CollectDay', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', + models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True), + ), ('date', models.DateField()), ], options={ @@ -25,21 +28,25 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Commune', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', + models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True), + ), ('name', models.CharField(max_length=50)), ('insee', models.CharField(max_length=10)), ], - options={ - }, + options={}, bases=(models.Model,), ), migrations.CreateModel( name='Sector', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', + models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True), + ), ], - options={ - }, + options={}, bases=(models.Model,), ), migrations.AddField( diff --git a/passerelle_montpellier_encombrants/migrations/0005_street.py b/passerelle_montpellier_encombrants/migrations/0005_street.py index 7abb8fa..bcb3245 100644 --- a/passerelle_montpellier_encombrants/migrations/0005_street.py +++ b/passerelle_montpellier_encombrants/migrations/0005_street.py @@ -14,12 +14,14 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Street', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ( + 'id', + models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True), + ), ('name', models.CharField(max_length=128, verbose_name='Street')), ('commune', models.ForeignKey(to='passerelle_montpellier_encombrants.Commune')), ], - options={ - }, + options={}, bases=(models.Model,), ), ] diff --git a/passerelle_montpellier_encombrants/migrations/0007_auto_20150915_1014.py b/passerelle_montpellier_encombrants/migrations/0007_auto_20150915_1014.py index 1230c0e..1575581 100644 --- a/passerelle_montpellier_encombrants/migrations/0007_auto_20150915_1014.py +++ b/passerelle_montpellier_encombrants/migrations/0007_auto_20150915_1014.py @@ -14,7 +14,9 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='sector', name='contact_email', - field=models.CharField(help_text='separated by commas', max_length=128, verbose_name='Contact Emails', blank=True), + field=models.CharField( + help_text='separated by commas', max_length=128, verbose_name='Contact Emails', blank=True + ), preserve_default=True, ), ] diff --git a/passerelle_montpellier_encombrants/migrations/0008_auto_20151201_0440.py b/passerelle_montpellier_encombrants/migrations/0008_auto_20151201_0440.py index bd43f94..1244a79 100644 --- a/passerelle_montpellier_encombrants/migrations/0008_auto_20151201_0440.py +++ b/passerelle_montpellier_encombrants/migrations/0008_auto_20151201_0440.py @@ -14,7 +14,9 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='sector', name='contact_email', - field=models.CharField(help_text='separated by commas', max_length=1024, verbose_name='Contact Emails', blank=True), + field=models.CharField( + help_text='separated by commas', max_length=1024, verbose_name='Contact Emails', blank=True + ), preserve_default=True, ), ] diff --git a/passerelle_montpellier_encombrants/migrations/0009_encombrantsmanagement_log_level.py b/passerelle_montpellier_encombrants/migrations/0009_encombrantsmanagement_log_level.py index 6c4cb3d..169e6fe 100644 --- a/passerelle_montpellier_encombrants/migrations/0009_encombrantsmanagement_log_level.py +++ b/passerelle_montpellier_encombrants/migrations/0009_encombrantsmanagement_log_level.py @@ -14,6 +14,19 @@ class Migration(migrations.Migration): migrations.AddField( model_name='encombrantsmanagement', name='log_level', - field=models.CharField(default=b'NOTSET', max_length=10, verbose_name='Log Level', choices=[(b'NOTSET', b'NOTSET'), (b'DEBUG', b'DEBUG'), (b'INFO', b'INFO'), (b'WARNING', b'WARNING'), (b'ERROR', b'ERROR'), (b'CRITICAL', b'CRITICAL'), (b'FATAL', b'FATAL')]), + field=models.CharField( + default=b'NOTSET', + max_length=10, + verbose_name='Log Level', + choices=[ + (b'NOTSET', b'NOTSET'), + (b'DEBUG', b'DEBUG'), + (b'INFO', b'INFO'), + (b'WARNING', b'WARNING'), + (b'ERROR', b'ERROR'), + (b'CRITICAL', b'CRITICAL'), + (b'FATAL', b'FATAL'), + ], + ), ), ] diff --git a/passerelle_montpellier_encombrants/migrations/0011_auto_20180101_1706.py b/passerelle_montpellier_encombrants/migrations/0011_auto_20180101_1706.py index db01b37..64bdd9d 100644 --- a/passerelle_montpellier_encombrants/migrations/0011_auto_20180101_1706.py +++ b/passerelle_montpellier_encombrants/migrations/0011_auto_20180101_1706.py @@ -15,6 +15,19 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='encombrantsmanagement', name='log_level', - field=models.CharField(choices=[(b'NOTSET', b'NOTSET'), (b'DEBUG', b'DEBUG'), (b'INFO', b'INFO'), (b'WARNING', b'WARNING'), (b'ERROR', b'ERROR'), (b'CRITICAL', b'CRITICAL'), (b'FATAL', b'FATAL')], default=b'INFO', max_length=10, verbose_name='Log Level'), + field=models.CharField( + choices=[ + (b'NOTSET', b'NOTSET'), + (b'DEBUG', b'DEBUG'), + (b'INFO', b'INFO'), + (b'WARNING', b'WARNING'), + (b'ERROR', b'ERROR'), + (b'CRITICAL', b'CRITICAL'), + (b'FATAL', b'FATAL'), + ], + default=b'INFO', + max_length=10, + verbose_name='Log Level', + ), ), ] diff --git a/passerelle_montpellier_encombrants/models.py b/passerelle_montpellier_encombrants/models.py index deb1ac0..0cd5d2b 100644 --- a/passerelle_montpellier_encombrants/models.py +++ b/passerelle_montpellier_encombrants/models.py @@ -21,6 +21,7 @@ from django.utils.translation import ugettext_lazy as _ from passerelle.base.models import BaseResource + class EncombrantsManagement(BaseResource): category = _('Business Process Connectors') @@ -45,9 +46,9 @@ class EncombrantsManagement(BaseResource): @six.python_2_unicode_compatible class Sector(models.Model): - contact_email = models.CharField(max_length=1024, blank=True, - verbose_name=_('Contact Emails'), - help_text=_('separated by commas')) + contact_email = models.CharField( + max_length=1024, blank=True, verbose_name=_('Contact Emails'), help_text=_('separated by commas') + ) class Meta: verbose_name = _('Sector') @@ -61,10 +62,8 @@ class Sector(models.Model): @six.python_2_unicode_compatible class Commune(models.Model): - name = models.CharField(max_length=50, blank=False, - verbose_name=_('Name')) - insee = models.CharField(max_length=10, blank=False, - verbose_name=_('INSEE Code')) + name = models.CharField(max_length=50, blank=False, verbose_name=_('Name')) + insee = models.CharField(max_length=10, blank=False, verbose_name=_('INSEE Code')) sector = models.ForeignKey(Sector, verbose_name=_('Sector')) def __str__(self): @@ -74,8 +73,7 @@ class Commune(models.Model): @six.python_2_unicode_compatible class Street(models.Model): commune = models.ForeignKey(Commune) - name = models.CharField(max_length=128, blank=False, - verbose_name=_('Street')) + name = models.CharField(max_length=128, blank=False, verbose_name=_('Street')) def __str__(self): return '%s, %s' % (self.name, self.commune) @@ -83,8 +81,7 @@ class Street(models.Model): @six.python_2_unicode_compatible class CollectDay(models.Model): - sector = models.ForeignKey(Sector, - verbose_name=_('Sector')) + sector = models.ForeignKey(Sector, verbose_name=_('Sector')) date = models.DateField(verbose_name=_('Date')) class Meta: diff --git a/passerelle_montpellier_encombrants/ods.py b/passerelle_montpellier_encombrants/ods.py index 1a7db13..45f724f 100644 --- a/passerelle_montpellier_encombrants/ods.py +++ b/passerelle_montpellier_encombrants/ods.py @@ -52,17 +52,23 @@ class Workbook(object): z = zipfile.ZipFile(output, 'w') z.writestr('content.xml', self.get_data()) z.writestr('mimetype', 'application/vnd.oasis.opendocument.spreadsheet') - z.writestr('META-INF/manifest.xml', ''' + z.writestr( + 'META-INF/manifest.xml', + ''' -''') - z.writestr('styles.xml', ''' +''', + ) + z.writestr( + 'styles.xml', + ''' -''') +''', + ) z.close() @@ -81,9 +87,9 @@ class WorkSheet(object): root = ET.Element('{%s}table' % TABLE_NS) root.attrib['{%s}name' % TABLE_NS] = self.name ET.SubElement(root, '{%s}table-column' % TABLE_NS) - for i in range(0, max(self.cells.keys())+1): + for i in range(0, max(self.cells.keys()) + 1): row = ET.SubElement(root, '{%s}table-row' % TABLE_NS) - for j in range(0, max(self.cells.get(i).keys())+1): + for j in range(0, max(self.cells.get(i).keys()) + 1): cell = self.cells.get(i, {}).get(j, None) if not cell: ET.SubElement(row, '{%s}table-cell' % TABLE_NS) diff --git a/passerelle_montpellier_encombrants/urls.py b/passerelle_montpellier_encombrants/urls.py index b95ae62..6224ac0 100644 --- a/passerelle_montpellier_encombrants/urls.py +++ b/passerelle_montpellier_encombrants/urls.py @@ -21,51 +21,76 @@ from django.contrib.auth.decorators import login_required from .views import * public_urlpatterns = [ - url(r'^(?P[\w,-]+)/$', EncombrantsManagementDetailView.as_view(), - name='montpellier-encombrants-view'), - url(r'^(?P[\w,-]+)/available/(?P\d+)$', AvailableDaysView.as_view(), - name='montpellier-encombrants-available-days'), + url( + r'^(?P[\w,-]+)/$', + EncombrantsManagementDetailView.as_view(), + name='montpellier-encombrants-view', + ), + url( + r'^(?P[\w,-]+)/available/(?P\d+)$', + AvailableDaysView.as_view(), + name='montpellier-encombrants-available-days', + ), ] management_urlpatterns = [ - url(r'^add$', EncombrantsManagementCreateView.as_view(), - name='montpellier-encombrants-add'), - url(r'^(?P[\w,-]+)/edit$', EncombrantsManagementUpdateView.as_view(), - name='montpellier-encombrants-edit'), - url(r'^(?P[\w,-]+)/delete$', EncombrantsManagementDeleteView.as_view(), - name='montpellier-encombrants-delete'), - url(r'^sectors/$', SectorListView.as_view(), - name='montpellier-encombrants-sector-listing'), - url(r'^sectors/add$', SectorCreateView.as_view(), - name='montpellier-encombrants-sector-add'), - url(r'^sectors/(?P[\w,-]+)/$', SectorUpdateView.as_view(), - name='montpellier-encombrants-sector-update'), - url(r'^sectors/(?P[\w,-]+)/delete$', SectorDeleteView.as_view(), - name='montpellier-encombrants-sector-remove'), - url(r'^communes/$', CommuneListView.as_view(), - name='montpellier-encombrants-commune-listing'), - url(r'^communes/add$', CommuneCreateView.as_view(), - name='montpellier-encombrants-commune-add'), - url(r'^communes/(?P[\w,-]+)/edit$', CommuneUpdateView.as_view(), - name='montpellier-encombrants-commune-edit'), - url(r'^communes/(?P[\w,-]+)$', CommuneView.as_view(), - name='montpellier-encombrants-commune-view'), - url(r'^communes/(?P[\w,-]+)/streets$', StreetEditView.as_view(), - name='montpellier-encombrants-commune-streets-edit-view'), - url(r'^communes/(?P[\w,-]+)/delete$', CommuneDeleteView.as_view(), - name='montpellier-encombrants-commune-remove'), - url(r'^collectdays/$', CollectDayListView.as_view(), - name='montpellier-encombrants-collectday-listing'), - url(r'^collectdays/add$', CollectDayCreateView.as_view(), - name='montpellier-encombrants-collectday-add'), - url(r'^collectdays/(?P[\w,-]+)/delete$', CollectDayDeleteView.as_view(), - name='montpellier-encombrants-collectday-remove'), + url(r'^add$', EncombrantsManagementCreateView.as_view(), name='montpellier-encombrants-add'), + url( + r'^(?P[\w,-]+)/edit$', + EncombrantsManagementUpdateView.as_view(), + name='montpellier-encombrants-edit', + ), + url( + r'^(?P[\w,-]+)/delete$', + EncombrantsManagementDeleteView.as_view(), + name='montpellier-encombrants-delete', + ), + url(r'^sectors/$', SectorListView.as_view(), name='montpellier-encombrants-sector-listing'), + url(r'^sectors/add$', SectorCreateView.as_view(), name='montpellier-encombrants-sector-add'), + url( + r'^sectors/(?P[\w,-]+)/$', + SectorUpdateView.as_view(), + name='montpellier-encombrants-sector-update', + ), + url( + r'^sectors/(?P[\w,-]+)/delete$', + SectorDeleteView.as_view(), + name='montpellier-encombrants-sector-remove', + ), + url(r'^communes/$', CommuneListView.as_view(), name='montpellier-encombrants-commune-listing'), + url(r'^communes/add$', CommuneCreateView.as_view(), name='montpellier-encombrants-commune-add'), + url( + r'^communes/(?P[\w,-]+)/edit$', + CommuneUpdateView.as_view(), + name='montpellier-encombrants-commune-edit', + ), + url(r'^communes/(?P[\w,-]+)$', CommuneView.as_view(), name='montpellier-encombrants-commune-view'), + url( + r'^communes/(?P[\w,-]+)/streets$', + StreetEditView.as_view(), + name='montpellier-encombrants-commune-streets-edit-view', + ), + url( + r'^communes/(?P[\w,-]+)/delete$', + CommuneDeleteView.as_view(), + name='montpellier-encombrants-commune-remove', + ), + url(r'^collectdays/$', CollectDayListView.as_view(), name='montpellier-encombrants-collectday-listing'), + url(r'^collectdays/add$', CollectDayCreateView.as_view(), name='montpellier-encombrants-collectday-add'), + url( + r'^collectdays/(?P[\w,-]+)/delete$', + CollectDayDeleteView.as_view(), + name='montpellier-encombrants-collectday-remove', + ), ] urlpatterns = required( - app_enabled('passerelle_montpellier_encombrants'), [ + app_enabled('passerelle_montpellier_encombrants'), + [ url(r'^montpellier-encombrants/', include(public_urlpatterns)), - url(r'^manage/montpellier-encombrants/', - decorated_includes(login_required, include(management_urlpatterns))), - ] + url( + r'^manage/montpellier-encombrants/', + decorated_includes(login_required, include(management_urlpatterns)), + ), + ], ) diff --git a/passerelle_montpellier_encombrants/utils.py b/passerelle_montpellier_encombrants/utils.py index e54f683..07a2bcf 100644 --- a/passerelle_montpellier_encombrants/utils.py +++ b/passerelle_montpellier_encombrants/utils.py @@ -43,35 +43,37 @@ prefix_map = { 'ENCL': 'ENCLOS', 'ESP': 'ESPLANADE', 'ESPA': 'ESPACE', - 'GR': '', # "GR GRAND-RUE JEAN MOULIN" + 'GR': '', # "GR GRAND-RUE JEAN MOULIN" 'IMP': 'IMPASSE', 'JARD': 'JARDIN', - 'MAIL': '', # "MAIL LE GRAND MAIL" + 'MAIL': '', # "MAIL LE GRAND MAIL" 'PARC': 'PARC', - 'PARV': '', # "PARV PARVIS DE LA LEGION D HONNEUR" + 'PARV': '', # "PARV PARVIS DE LA LEGION D HONNEUR" 'PAS': 'PASSAGE', 'PL': 'PLACE', 'PLAN': 'PLAN', 'PONT': 'PONT', 'QUA': 'QUAI', 'R': 'RUE', - 'RAMB': '', # "RAMB RAMBLA DES CALISSONS" + 'RAMB': '', # "RAMB RAMBLA DES CALISSONS" 'RPT': 'ROND-POINT', 'RTE': 'ROUTE', 'SQ': 'SQUARE', - 'TSSE': '', # "TSSE TERRASSE DES ALLEES DU BOIS" + 'TSSE': '', # "TSSE TERRASSE DES ALLEES DU BOIS" 'TUN': 'TUNNEL', 'VIAD': 'VIADUC', 'VOI': 'VOIE', } + def prefix_cleanup(name): name = name.strip() for prefix, full in prefix_map.items(): if name.startswith(prefix + ' '): - name = (full + name[len(prefix):]).strip() + name = (full + name[len(prefix) :]).strip() return name + def get_sector(insee, address=None): communes = Commune.objects.filter(insee=insee) for commune in communes: @@ -83,6 +85,7 @@ def get_sector(insee, address=None): else: return commune.sector + def email_sectors(formdatas, when): subject = get_template('passerelle_montpellier_encombrants/email_subject.txt') message = get_template('passerelle_montpellier_encombrants/email_body.txt') @@ -95,8 +98,10 @@ def email_sectors(formdatas, when): for data in formdatas: fields = data['fields'] - data = [fields.get(d) or '' for d in ('commune', 'prenom', 'nom', 'numero', - 'voie', 'date', 'telephone', 'commentaire')] + data = [ + fields.get(d) or '' + for d in ('commune', 'prenom', 'nom', 'numero', 'voie', 'date', 'telephone', 'commentaire') + ] sector = get_sector(fields.get('commune_raw'), fields.get('adresse')) if sector: @@ -104,8 +109,12 @@ def email_sectors(formdatas, when): for destination, data in sectors.items(): destinations = [d.strip() for d in destination.split(',') if d.strip()] - mail = EmailMessage(subject.render(context).strip(), message.render(context), - settings.DEFAULT_FROM_EMAIL, destinations) + mail = EmailMessage( + subject.render(context).strip(), + message.render(context), + settings.DEFAULT_FROM_EMAIL, + destinations, + ) attachement_body = BytesIO() # create ods @@ -119,9 +128,11 @@ def email_sectors(formdatas, when): for i, d in enumerate(data): for j, e in enumerate(d): - ws.write(i+1, j, e) + ws.write(i + 1, j, e) ods.save(attachement_body) - mail.attach('demandes.ods', attachement_body.getvalue(), 'application/vnd.oasis.opendocument.spreadsheet') + mail.attach( + 'demandes.ods', attachement_body.getvalue(), 'application/vnd.oasis.opendocument.spreadsheet' + ) mail.send() diff --git a/passerelle_montpellier_encombrants/views.py b/passerelle_montpellier_encombrants/views.py index a90ec53..1bed808 100644 --- a/passerelle_montpellier_encombrants/views.py +++ b/passerelle_montpellier_encombrants/views.py @@ -26,8 +26,13 @@ from django.db import transaction from passerelle import utils as passerelle_utils from .models import EncombrantsManagement, Sector, Commune, CollectDay, Street -from .forms import (EncombrantsManagementForm, EncombrantsManagementUpdateForm, CommuneForm, - StreetsForm, NoStreetsCommuneForm) +from .forms import ( + EncombrantsManagementForm, + EncombrantsManagementUpdateForm, + CommuneForm, + StreetsForm, + NoStreetsCommuneForm, +) from .forms import SectorForm from .utils import prefix_cleanup, get_sector @@ -164,10 +169,11 @@ class AvailableDaysView(View, SingleObjectMixin): else: collect_days = [] limit = request.GET.get('limit') - result = [{'id': x.date.strftime('%Y-%m-%d'), - 'text': x.date.strftime('%d/%m/%Y')} for x in collect_days] + result = [ + {'id': x.date.strftime('%Y-%m-%d'), 'text': x.date.strftime('%d/%m/%Y')} for x in collect_days + ] if limit: - result = result[:int(limit)] + result = result[: int(limit)] return passerelle_utils.response_for_json(request, {'data': result}) @@ -176,8 +182,7 @@ class StreetEditView(FormView): template_name = 'passerelle/manage/service_form.html' def get_success_url(self): - return reverse('montpellier-encombrants-commune-view', - kwargs={'pk': self.kwargs['pk']}) + return reverse('montpellier-encombrants-commune-view', kwargs={'pk': self.kwargs['pk']}) def get_initial(self): try: diff --git a/setup.py b/setup.py index 372ce57..4f2e32d 100644 --- a/setup.py +++ b/setup.py @@ -25,9 +25,9 @@ class eo_sdist(sdist): def get_version(): - '''Use the VERSION, if absent generates a version with git describe, if not - tag exists, take 0.0- and add the length of the commit log. - ''' + """Use the VERSION, if absent generates a version with git describe, if not + tag exists, take 0.0- and add the length of the commit log. + """ if os.path.exists('VERSION'): with open('VERSION', 'r') as v: return v.read() @@ -65,6 +65,7 @@ class compile_translations(Command): curdir = os.getcwd() try: from django.core.management import call_command + for path, dirs, files in os.walk('passerelle_montpellier_encombrants'): if 'locale' not in dirs: continue @@ -104,13 +105,14 @@ setup( 'Programming Language :: Python', 'Programming Language :: Python :: 2', ], - install_requires=['django>=1.11, <1.12', - ], + install_requires=[ + 'django>=1.11, <1.12', + ], zip_safe=False, cmdclass={ 'build': build, 'compile_translations': compile_translations, 'install_lib': install_lib, 'sdist': eo_sdist, - } + }, ) diff --git a/tests/settings.py b/tests/settings.py index 484bf2e..2187fae 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -3,15 +3,14 @@ import os LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' -INSTALLED_APPS += ( - 'passerelle_montpellier_encombrants', -) +INSTALLED_APPS += ('passerelle_montpellier_encombrants',) DATABASES = { 'default': { 'ENGINE': os.environ.get('DB_ENGINE', 'django.db.backends.sqlite3'), 'TEST': { - 'NAME': 'passerelle-montpellier-encombrants-test-%s' % os.environ.get('BRANCH_NAME', '').replace('/', '-')[:63], + 'NAME': 'passerelle-montpellier-encombrants-test-%s' + % os.environ.get('BRANCH_NAME', '').replace('/', '-')[:63], }, } } diff --git a/tests/test_main.py b/tests/test_main.py index 23efb94..b5ba424 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -11,15 +11,29 @@ from django.core.urlresolvers import reverse from django.utils.encoding import force_text from passerelle_montpellier_encombrants.models import ( - EncombrantsManagement, Commune, Sector, CollectDay, Street) + EncombrantsManagement, + Commune, + Sector, + CollectDay, + Street, +) -maurin_streets = ('CHE DES JARDINS DE MAGUELONE', 'RTE DEPARTEMENTALE 132', - 'CHE DE SAINT-HUBERT', 'PLAN DU MAS DE SARDAN', - 'R DES ROBINIERS') +maurin_streets = ( + 'CHE DES JARDINS DE MAGUELONE', + 'RTE DEPARTEMENTALE 132', + 'CHE DE SAINT-HUBERT', + 'PLAN DU MAS DE SARDAN', + 'R DES ROBINIERS', +) -lattes_streets = ('AV DE BOIRARGUES', 'RPT DE LA FONTVIN', 'PLAN ROSSINI', - 'R DES CYCLAMENS', 'RTE DEPARTEMENTALE 172', - 'CHE DU MAS DE CAUSSE À L\'ESTELLE') +lattes_streets = ( + 'AV DE BOIRARGUES', + 'RPT DE LA FONTVIN', + 'PLAN ROSSINI', + 'R DES CYCLAMENS', + 'RTE DEPARTEMENTALE 172', + 'CHE DU MAS DE CAUSSE À L\'ESTELLE', +) class EncombrantsTestCase(TestCase): @@ -27,15 +41,17 @@ class EncombrantsTestCase(TestCase): def setUp(self): self.client = Client() - self.instance = EncombrantsManagement.objects.create(title='montpellier', - slug='montpellier', - description='encombrants') + self.instance = EncombrantsManagement.objects.create( + title='montpellier', slug='montpellier', description='encombrants' + ) self.now = datetime.datetime.now() - for mail, insee, name in (('cournonsec@montpellier3m.fr', '34087', 'Cournonsec'), - ('jacou@montpellier3m.fr', '34120', 'Jacou'), - ('castelnau@montpellier3m.fr', '34057', 'Castelnau'), - ('prades@montpellier3m.fr', '34217', 'Prades'), - ('sussargues@montpellier3m.fr', '34307', 'Sussargues')): + for mail, insee, name in ( + ('cournonsec@montpellier3m.fr', '34087', 'Cournonsec'), + ('jacou@montpellier3m.fr', '34120', 'Jacou'), + ('castelnau@montpellier3m.fr', '34057', 'Castelnau'), + ('prades@montpellier3m.fr', '34217', 'Prades'), + ('sussargues@montpellier3m.fr', '34307', 'Sussargues'), + ): sector = Sector.objects.create(contact_email=mail) commune = Commune.objects.create(sector=sector, insee=insee, name=name) for i in range(2, randint(3, 10)): @@ -44,75 +60,90 @@ class EncombrantsTestCase(TestCase): def test_collectdays(self): for commune in Commune.objects.all(): - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, 'insee': commune.insee})) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': commune.insee}, + ) + ) data = json.loads(force_text(r.content)) def test_collectdays_in_communes_with_street(self): maurin_sector = Sector.objects.create(contact_email='maurin@montpellier3m.fr') - maurin_commune = Commune.objects.create(sector=maurin_sector, name='Maurin', - insee='34970') + maurin_commune = Commune.objects.create(sector=maurin_sector, name='Maurin', insee='34970') lattes_sector = Sector.objects.create(contact_email='lattes@montpellier3m.fr') - lattes_commune = Commune.objects.create(sector=lattes_sector, name='Lattes', - insee='34970') + lattes_commune = Commune.objects.create(sector=lattes_sector, name='Lattes', insee='34970') for s in maurin_streets: Street.objects.create(commune=maurin_commune, name=s) - - CollectDay.objects.create(sector=maurin_sector, - date=self.now + datetime.timedelta(days=2)) - + CollectDay.objects.create(sector=maurin_sector, date=self.now + datetime.timedelta(days=2)) # Maurin - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, - 'insee': '34970'}), {'adresse': 'PLAN DU MAS DE SARDAN'}) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': '34970'}, + ), + {'adresse': 'PLAN DU MAS DE SARDAN'}, + ) data = json.loads(force_text(r.content)) - #self.assertNotEqual(data['data'], []) + # self.assertNotEqual(data['data'], []) # Lattes for s in lattes_streets: Street.objects.create(commune=lattes_commune, name=s) - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, - 'insee': '34970'}), {'adresse': 'ROUTE DEPARTEMENTALE 172'}) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': '34970'}, + ), + {'adresse': 'ROUTE DEPARTEMENTALE 172'}, + ) data = json.loads(force_text(r.content)) - #self.assertEqual(data['data'], []) + # self.assertEqual(data['data'], []) - CollectDay.objects.create(sector=lattes_sector, - date=self.now + datetime.timedelta(days=4)) + CollectDay.objects.create(sector=lattes_sector, date=self.now + datetime.timedelta(days=4)) - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, - 'insee': '34970'}), {'adresse': 'ROUTE DEPARTEMENTALE 172'}) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': '34970'}, + ), + {'adresse': 'ROUTE DEPARTEMENTALE 172'}, + ) data = json.loads(force_text(r.content)) self.assertNotEqual(data['data'], []) - def test_collectdays_nonexisting_street(self): - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, - 'insee': '34970'}), {'adresse': 'Nonexisting street'}) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': '34970'}, + ), + {'adresse': 'Nonexisting street'}, + ) data = json.loads(force_text(r.content)) self.assertEqual(data['data'], []) def test_collectdays_random_case_street(self): lattes_sector = Sector.objects.create(contact_email='lattes@montpellier3m.fr') - lattes_commune = Commune.objects.create(sector=lattes_sector, name='Lattes', - insee='34970') + lattes_commune = Commune.objects.create(sector=lattes_sector, name='Lattes', insee='34970') for s in lattes_streets: Street.objects.create(commune=lattes_commune, name=s) - CollectDay.objects.create(sector=lattes_sector, - date=self.now + datetime.timedelta(days=10)) + CollectDay.objects.create(sector=lattes_sector, date=self.now + datetime.timedelta(days=10)) - r = self.client.get(reverse('montpellier-encombrants-available-days', - kwargs={'slug': self.instance.slug, - 'insee': '34970'}), {'adresse': 'route departementale 172'}) + r = self.client.get( + reverse( + 'montpellier-encombrants-available-days', + kwargs={'slug': self.instance.slug, 'insee': '34970'}, + ), + {'adresse': 'route departementale 172'}, + ) data = json.loads(force_text(r.content)) self.assertNotEqual(data['data'], [])