style(lint): rend black heureux

pull/47/head
Jérôme Lebleu 2019-07-04 18:44:32 +02:00
Parent c5ee2fc2b6
révision f95799fa0f
16 fichiers modifiés avec 131 ajouts et 136 suppressions

Voir le fichier

@ -54,7 +54,7 @@ def event_install(organisation):
organisation=organisation,
place_name="LAG",
date_start=datetime.date(2019, 1, 1),
time_start=datetime.time(18, 0)
time_start=datetime.time(18, 0),
)

Voir le fichier

@ -26,7 +26,8 @@ from ess62_plateforme.utils.images import resize_image_to_file
""" Taille de la vignette d'un évènement """
EVENT_IMAGE_THUMB_SIZE = getattr(
settings, 'EVENT_IMAGE_THUMB_SIZE', (300, 300))
settings, 'EVENT_IMAGE_THUMB_SIZE', (300, 300)
)
def upload_image_to(instance, filename):
@ -42,7 +43,6 @@ def upload_thumb_to(instance, filename):
class EventQuerySet(models.QuerySet):
def live(self):
"""Filtre avec les évènements publiés."""
return self.filter(live=True)
@ -67,14 +67,14 @@ class Event(models.Model):
Activite,
related_name='+',
verbose_name="activités",
help_text=(
"Une liste d'une ou plusieurs activités."
),
help_text="Une liste d'une ou plusieurs activités.",
)
image = models.ImageField(
'Image', upload_to=upload_image_to, null=True, blank=True)
'Image', upload_to=upload_image_to, null=True, blank=True
)
image_thumb = models.ImageField(
upload_to=upload_thumb_to, editable=False, null=True, blank=True)
upload_to=upload_thumb_to, editable=False, null=True, blank=True
)
# Détails
description = models.TextField("Description", blank=True)
@ -101,9 +101,7 @@ class Event(models.Model):
live = models.BooleanField(
"publié",
default=True,
help_text=(
"Si l'évènement doit apparaître sur le site."
),
help_text="Si l'évènement doit apparaître sur le site.",
)
slug = models.SlugField(
"slug",
@ -132,10 +130,7 @@ class Event(models.Model):
# Panneaux pour l'administration
content_panels = [
MultiFieldPanel(
[
FieldPanel('organisation'),
],
heading="Organisation associée",
[FieldPanel('organisation')], heading="Organisation associée"
),
MultiFieldPanel(
[
@ -148,14 +143,12 @@ class Event(models.Model):
),
MultiFieldPanel(
[
FieldRowPanel([
FieldPanel('date_start'),
FieldPanel('date_end'),
]),
FieldRowPanel([
FieldPanel('time_start'),
FieldPanel('time_end'),
]),
FieldRowPanel(
[FieldPanel('date_start'), FieldPanel('date_end')]
),
FieldRowPanel(
[FieldPanel('time_start'), FieldPanel('time_end')]
),
],
heading="Date et heure",
),
@ -163,10 +156,9 @@ class Event(models.Model):
[
FieldPanel('place_name'),
FieldPanel('place_street'),
FieldRowPanel([
FieldPanel('place_zip_code'),
FieldPanel('place_city'),
]),
FieldRowPanel(
[FieldPanel('place_zip_code'), FieldPanel('place_city')]
),
],
heading="Adresse",
),
@ -174,22 +166,29 @@ class Event(models.Model):
promote_panels = [
MultiFieldPanel(
[
FieldPanel('slug', widget=forms.TextInput(attrs={
# En laissant l'id par défaut (id_slug), le slug va être
# automatiquement généré avec le titre en JavaScript par
# Wagtail, ce qu'on ne veut pas ici.
'id': 'event_slug',
})),
FieldPanel(
'slug',
widget=forms.TextInput(
attrs={
# En laissant l'id par défaut (id_slug), le slug
# va être automatiquement généré avec le titre
# en JavaScript par Wagtail, ce qu'on ne veut pas.
'id': 'event_slug'
}
),
),
FieldPanel('live'),
],
heading="Configuration générale",
),
)
]
edit_handler = TabbedInterface([
ObjectList(content_panels, heading="Contenu"),
ObjectList(promote_panels, heading="Promotion"),
])
edit_handler = TabbedInterface(
[
ObjectList(content_panels, heading="Contenu"),
ObjectList(promote_panels, heading="Promotion"),
]
)
class Meta:
verbose_name = 'évènement'
@ -214,6 +213,7 @@ class Event(models.Model):
return date_start
date_end = date_format(self.date_end, 'd b. Y')
return "{} - {}".format(date_start, date_end)
str_date.short_description = "Date"
str_date.admin_order_field = 'date_start'
@ -227,6 +227,7 @@ class Event(models.Model):
return time_start
time_end = time_format(self.time_end, 'H:i')
return "{} - {}".format(time_start, time_end)
str_time.short_description = "Heure"
str_time.admin_order_field = 'time_start'
@ -253,18 +254,16 @@ class Event(models.Model):
# Vérifie la date et l'heure de fin
if self.date_end and self.date_end < self.date_start:
errors['date_end'] = (
"La date de fin doit être supérieure à celle de début."
)
errors[
'date_end'
] = "La date de fin doit être supérieure à celle de début."
if self.time_end and self.time_end < self.time_start:
errors['time_end'] = (
"L'heure de fin doit être supérieure à celle de début."
)
errors[
'time_end'
] = "L'heure de fin doit être supérieure à celle de début."
if not self.slug:
errors['slug'] = (
"Le slug n'a pas pu être généré automatiquement."
)
errors['slug'] = "Le slug n'a pas pu être généré automatiquement."
if errors:
raise ValidationError(errors)
@ -278,10 +277,9 @@ class Event(models.Model):
if not self.date_start or not self.title:
return ''
base_slug = slugify('{}-{}'.format(
self.date_start.strftime('%Y%m%d'),
self.title,
))
base_slug = slugify(
'{}-{}'.format(self.date_start.strftime('%Y%m%d'), self.title)
)
suffix = 1
candidate_slug = base_slug
@ -311,4 +309,5 @@ class Event(models.Model):
if not self.image:
return
self.image_thumb = resize_image_to_file(
self.image, EVENT_IMAGE_THUMB_SIZE)
self.image, EVENT_IMAGE_THUMB_SIZE
)

Voir le fichier

@ -14,13 +14,12 @@ from ess62_plateforme.events.models import (
from ess62_plateforme.organisations.models import Activite, Organisation
FLOWER_PATH = os.path.join(
os.path.dirname(__file__),
'../../utils/tests/images/flower.jpg')
os.path.dirname(__file__), '../../utils/tests/images/flower.jpg'
)
@pytest.mark.django_db
class TestEventsModel:
@pytest.fixture
def activite(self):
return Activite.objects.create(nom='Informatique libre')
@ -130,7 +129,7 @@ class TestEventsModel:
event_install.image = SimpleUploadedFile(
name='test_image.jpg',
content=open(FLOWER_PATH, 'rb').read(),
content_type='image/jpeg'
content_type='image/jpeg',
)
event_install.generate_thumbnail()
assert event_install.image_thumb

Voir le fichier

@ -11,7 +11,9 @@ from .models import Event
class EventListView(ListView):
model = Event
context_object_name = 'events'
queryset = Event.objects.filter(live=True).upcoming().order_by('date_start')
queryset = (
Event.objects.filter(live=True).upcoming().order_by('date_start')
)
class EventDetailView(DetailView):
@ -42,5 +44,7 @@ class EventUpdateView(UserPassesObjectTestMixin, UpdateView):
template_name = 'events/event_form.html'
def test_func(self):
return self.request.user.is_authenticated \
return (
self.request.user.is_authenticated
and self.request.user == self.object.get_associated_user()
)

Voir le fichier

@ -11,11 +11,15 @@ class EventModelAdmin(ModelAdmin):
menu_icon = 'date'
# Liste des objets
list_display = (
'title_formatted', 'activites_list', 'str_date', 'str_time', 'live',
'title_formatted',
'activites_list',
'str_date',
'str_time',
'live',
'organisation',
)
list_filter = ('date_start', 'date_end')
search_fields = ('title', )
search_fields = ('title',)
list_per_page = 20
def get_extra_class_names_for_field_col(self, obj, field_name):
@ -27,18 +31,18 @@ class EventModelAdmin(ModelAdmin):
# ------------------------
def title_formatted(self, obj):
return format_html(
'<h2>{}</h2>',
obj.title,
)
return format_html('<h2>{}</h2>', obj.title)
title_formatted.short_description = "Titre"
title_formatted.admin_order_field = 'title'
def activites_list(self, obj):
return format_html_join(
' ', '<span class="status-activite primary">{}</span>',
([t.nom, ] for t in obj.activites.all()),
' ',
'<span class="status-activite primary">{}</span>',
([t.nom] for t in obj.activites.all()),
)
activites_list.short_description = "Activités"

Voir le fichier

@ -35,6 +35,7 @@ class Subscriber(models.Model):
"""
Un abonné à la newsletter.
"""
email = models.EmailField(unique=True)
activated = models.BooleanField(default=False)
activation_key = models.CharField(max_length=64)

Voir le fichier

@ -107,9 +107,7 @@ class TestSubscriptionConfirmView:
assert not response.context['subscriber']
assert not response.context['activated']
activation_key = self.subscriber.create_new_activation_key(
save=False
)
activation_key = self.subscriber.create_new_activation_key(save=False)
response = client.get(
reverse(

Voir le fichier

@ -34,8 +34,7 @@ class SubscribeView(FormView):
)
else:
self.send_activation_email(
subscriber.create_new_activation_key(),
subscriber.email,
subscriber.create_new_activation_key(), subscriber.email
)
messages.success(
self.request,
@ -69,7 +68,7 @@ class SubscribeView(FormView):
'newsletter/subscription_confirm_email.txt', context
),
settings.DEFAULT_FROM_EMAIL,
[to_email]
[to_email],
)
def get_success_url(self):

Voir le fichier

@ -31,10 +31,7 @@ class OrganisationFilterForm(CustomTapeformMixin, forms.Form):
required=False,
label="Prestations pour",
)
label_ess = forms.BooleanField(
required=False,
label="Label ESS 62"
)
label_ess = forms.BooleanField(required=False, label="Label ESS 62")
field_container_css_class = 'form-group mb-md-0'
field_template_overrides = {

Voir le fichier

@ -164,9 +164,7 @@ class Organisation(BaseAdresse):
"nom",
max_length=150,
unique=True,
error_messages={
'unique': "Une organisation existe déjà avec ce nom."
},
error_messages={'unique': "Une organisation existe déjà avec ce nom."},
)
logo = models.ImageField(
"logo", upload_to=upload_org_logo_to, blank=True, null=True

Voir le fichier

@ -70,25 +70,19 @@ class TestOrganisationCreateView:
@pytest.mark.django_db
class TestDashboardView:
def test_anonymous_user_redirect(self, client):
response = client.get(
reverse('organisations:dashboard')
)
response = client.get(reverse('organisations:dashboard'))
assert response.status_code == 302
assert 'login' in response.url
def test_not_linked_user_refused(self, client, organisation, user):
""" Un utilisateur qui n'est associé à aucune organisation """
client.login(username='robbie', password='sho7sho7')
response = client.get(
reverse('organisations:dashboard')
)
response = client.get(reverse('organisations:dashboard'))
assert response.status_code == 403
def test_linked_user_authorized(self, client, organisation, user):
organisation.user = user
organisation.save()
client.login(username='robbie', password='sho7sho7')
response = client.get(
reverse('organisations:dashboard')
)
response = client.get(reverse('organisations:dashboard'))
assert response.status_code == 200

Voir le fichier

@ -149,7 +149,8 @@ class DashboardView(UserPassesTestMixin, TemplateView):
organisation = self.get_organisation()
context['organisation'] = organisation
context['events'] = Event.objects.filter(
organisation=organisation).all()
organisation=organisation
).all()
return context
def get_organisation(self):
@ -161,5 +162,7 @@ class DashboardView(UserPassesTestMixin, TemplateView):
def test_func(self):
if not self.get_organisation():
return False
return self.request.user.is_authenticated \
return (
self.request.user.is_authenticated
and self.get_organisation().user == self.request.user
)

Voir le fichier

@ -18,5 +18,8 @@ if env.bool('READ_CONFIG_FILE', default=True):
"""The Django settings module's name to use."""
DJANGO_SETTINGS_MODULE = env(
'DJANGO_SETTINGS_MODULE', default='ess62_plateforme.settings.{}'.format(env(
'ENV', default=DEFAULT_ENVIRONMENT)))
'DJANGO_SETTINGS_MODULE',
default='ess62_plateforme.settings.{}'.format(
env('ENV', default=DEFAULT_ENVIRONMENT)
),
)

Voir le fichier

@ -55,9 +55,10 @@ USE_TZ = True
# https://docs.djangoproject.com/en/stable/ref/settings/#databases
# https://django-environ.readthedocs.io/en/stable/#supported-types
DATABASES = {
'default': env.db('DJANGO_DATABASE_URL', default='sqlite:///{}'.format(
base_dir('sqlite.db')
)),
'default': env.db(
'DJANGO_DATABASE_URL',
default='sqlite:///{}'.format(base_dir('sqlite.db')),
)
}
# URLS
@ -91,7 +92,6 @@ WAGTAIL_APPS = [
'wagtail.search',
'wagtail.admin',
'wagtail.core',
'modelcluster',
'taggit',
]
@ -137,20 +137,27 @@ PASSWORD_HASHERS = [
# https://docs.djangoproject.com/en/stable/topics/auth/passwords/#password-validation
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': ('django.contrib.auth.password_validation.'
'UserAttributeSimilarityValidator'),
'NAME': (
'django.contrib.auth.password_validation.'
'UserAttributeSimilarityValidator'
)
},
{
'NAME': ('django.contrib.auth.password_validation.'
'MinimumLengthValidator'),
'NAME': (
'django.contrib.auth.password_validation.MinimumLengthValidator'
)
},
{
'NAME': ('django.contrib.auth.password_validation.'
'CommonPasswordValidator'),
'NAME': (
'django.contrib.auth.password_validation.'
'CommonPasswordValidator'
)
},
{
'NAME': ('django.contrib.auth.password_validation.'
'NumericPasswordValidator'),
'NAME': (
'django.contrib.auth.password_validation.'
'NumericPasswordValidator'
)
},
]
@ -179,9 +186,7 @@ STATIC_ROOT = var_dir('static')
STATIC_URL = os.path.join(APP_LOCATION, 'static/')
# https://docs.djangoproject.com/en/stable/ref/settings/#staticfiles-dirs
STATICFILES_DIRS = [
root_dir('static'),
]
STATICFILES_DIRS = [root_dir('static')]
if os.path.isdir(local_dir('static')):
STATICFILES_DIRS.insert(0, local_dir('static'))
@ -210,9 +215,7 @@ FILE_UPLOAD_PERMISSIONS = 0o644
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
root_dir('templates'),
],
'DIRS': [root_dir('templates')],
'OPTIONS': {
'debug': DEBUG,
'loaders': [
@ -230,7 +233,7 @@ TEMPLATES = [
'ess62_plateforme.base.context_processors.site_name',
],
},
},
}
]
if os.path.isdir(local_dir('templates')):
TEMPLATES[0]['DIRS'].insert(0, local_dir('templates'))
@ -238,16 +241,13 @@ if os.path.isdir(local_dir('templates')):
# FIXTURES
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/stable/ref/settings/#fixture-dirs
FIXTURE_DIRS = (
root_dir('fixtures'),
)
FIXTURE_DIRS = (root_dir('fixtures'),)
# EMAIL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/stable/topics/email/#email-backends
# https://django-environ.readthedocs.io/en/stable/#supported-types
vars().update(env.email_url(
'DJANGO_EMAIL_URL', default='smtp://localhost:25'))
vars().update(env.email_url('DJANGO_EMAIL_URL', default='smtp://localhost:25'))
DEFAULT_FROM_EMAIL = env('DEFAULT_FROM_EMAIL', default='webmaster@localhost')
# Use the same email address for error messages
@ -256,9 +256,7 @@ SERVER_EMAIL = DEFAULT_FROM_EMAIL
# ADMIN
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/stable/ref/settings/#admins
ADMINS = [
("""Cliss XXI""", 'tech@cliss21.com'),
]
ADMINS = [("""Cliss XXI""", 'tech@cliss21.com')]
# https://docs.djangoproject.com/en/stable/ref/settings/#managers
MANAGERS = ADMINS

Voir le fichier

@ -13,18 +13,15 @@ from .base import env
SECRET_KEY = env('DJANGO_SECRET_KEY', default='CHANGEME!!!')
# https://docs.djangoproject.com/en/stable/ref/settings/#allowed-hosts
ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=[
'localhost',
'0.0.0.0',
'127.0.0.1',
])
ALLOWED_HOSTS = env.list(
'DJANGO_ALLOWED_HOSTS', default=['localhost', '0.0.0.0', '127.0.0.1']
)
# EMAIL
# ------------------------------------------------------------------------------
# https://docs.djangoproject.com/en/stable/topics/email/#email-backends
# https://django-environ.readthedocs.io/en/stable/#supported-types
vars().update(env.email_url(
'DJANGO_EMAIL_URL', default='consolemail://'))
vars().update(env.email_url('DJANGO_EMAIL_URL', default='consolemail://'))
# WAGTAIL
# ------------------------------------------------------------------------------
@ -44,9 +41,7 @@ INSTALLED_APPS += ['debug_toolbar'] # noqa: F405
INTERNAL_IPS = ['127.0.0.1']
DEBUG_TOOLBAR_CONFIG = {
'DISABLE_PANELS': [
'debug_toolbar.panels.redirects.RedirectsPanel',
],
'DISABLE_PANELS': ['debug_toolbar.panels.redirects.RedirectsPanel'],
'SHOW_TEMPLATE_CONTEXT': True,
# Uncomment if jQuery is already loaded by your assets:
'JQUERY_URL': '',

Voir le fichier

@ -45,10 +45,13 @@ ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=[])
# https://docs.djangoproject.com/en/stable/ref/settings/#templates
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG # noqa F405
TEMPLATES[0]['OPTIONS']['loaders'] = [ # noqa F405
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
]),
(
'django.template.loaders.cached.Loader',
[
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
],
)
]
# LOGGING
@ -59,13 +62,13 @@ LOGGING = {
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(asctime)s - %(levelname)s - %(module)s: %(message)s',
},
'format': '%(asctime)s - %(levelname)s - %(module)s: %(message)s'
}
},
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
'class': 'django.utils.log.AdminEmailHandler',
},
'file': {
'level': 'DEBUG',