diff --git a/.docker-entrypoint-ubuntu.sh.swp b/.docker-entrypoint-ubuntu.sh.swp
new file mode 100644
index 0000000000000000000000000000000000000000..2b19f0ffc4ffe4df758b3f90d6a4b027a646157e
Binary files /dev/null and b/.docker-entrypoint-ubuntu.sh.swp differ
diff --git a/Dockerfile b/Dockerfile
index 6b755551d7f520eeea071fdc8cfd62b74584528c..697df63bf6c4183f61b69a85363125507fa30396 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,7 +12,8 @@ RUN apk add --no-cache \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
postgresql-client \
libpq \
- nginx\
+ nginx \
+ binutils \
&& apk add --no-cache \
--upgrade \
--repository http://dl-cdn.alpinelinux.org/alpine/edge/main \
@@ -20,13 +21,13 @@ RUN apk add --no-cache \
postgresql-dev \
zlib-dev jpeg-dev \
alpine-sdk \
+ poppler \
&& apk add --no-cache \
--upgrade \
- --repository http://dl-cdn.alpinelinux.org/alpine/edge/testing \
+ --repository http://dl-cdn.alpinelinux.org/alpine/edge/community \
geos \
proj \
gdal \
- binutils \
&& ln -s /usr/lib/libproj.so.15 /usr/lib/libproj.so \
&& ln -s /usr/lib/libgdal.so.20 /usr/lib/libgdal.so \
&& ln -s /usr/lib/libgeos_c.so.1 /usr/lib/libgeos_c.so \
diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu
new file mode 100644
index 0000000000000000000000000000000000000000..b863c14547dbf2ce81ed4e64d7a99e7ac2dff993
--- /dev/null
+++ b/Dockerfile.ubuntu
@@ -0,0 +1,32 @@
+FROM makinacorpus/geodjango:bionic-3.7
+
+ENV PYTHONUNBUFFERED 1
+ENV PYTHONDONTWRITEBYTECODE 1
+
+WORKDIR /usr/src/dbchiro
+
+COPY requirements.txt /usr/src/dbchiro
+
+RUN apt update -y \
+ && apt-get install -y \
+ postgresql-client \
+ nginx \
+ python3-pip
+
+COPY requirements.txt /usr/src/dbchiro
+
+RUN python3 -m pip install --upgrade pip \
+ && python3 -m pip install -r requirements.txt \
+ && python3 -m pip install gunicorn
+
+COPY docker-entrypoint-ubuntu.sh /usr/bin/docker-entrypoint.sh
+
+COPY . /usr/src/dbchiro
+
+VOLUME ["/dbchiro"]
+
+WORKDIR /app
+
+EXPOSE 80
+
+ENTRYPOINT ["/usr/bin/docker-entrypoint.sh"]
diff --git a/VERSION b/VERSION
index fdaf67f554f448019c8047ad2f855e889a1f078d..5dd05630f8ec7db2e158294038dd090b83c5378c 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.2.1-dev:
+1.2.1-dev
\ No newline at end of file
diff --git a/accounts/forms.py b/accounts/forms.py
index 2ef9cc93458ba304be3842d354b59c2953e66f15..04df258c6f1e8c0d074b2f695094a70875d7f6f0 100644
--- a/accounts/forms.py
+++ b/accounts/forms.py
@@ -80,11 +80,7 @@ class UserCreateAdminForm(UserCreationForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -103,20 +99,13 @@ class UserCreateAdminForm(UserCreationForm):
Fieldset(
_("Identité"),
Row(
+ Column("email", css_class="col-xs-12 col-lg-6"),
+ Column("organism", css_class="col-xs-12 col-lg-6",),
Column(
- "email", css_class="col-xs-12 col-lg-6"
- ),
- Column(
- "organism",
- css_class="col-xs-12 col-lg-6",
- ),
- Column(
- "first_name",
- css_class="col-xs-12 col-lg-6",
+ "first_name", css_class="col-xs-12 col-lg-6",
),
Column(
- "last_name",
- css_class="col-xs-12 col-lg-6",
+ "last_name", css_class="col-xs-12 col-lg-6",
),
),
Row(
@@ -145,8 +134,7 @@ class UserCreateAdminForm(UserCreationForm):
css_class="col-xs-12 col-lg-6",
),
Column(
- "edit_all_data",
- css_class="col-xs-12 col-lg-6",
+ "edit_all_data", css_class="col-xs-12 col-lg-6",
),
Column("catchauth", css_class="col-lg-12"),
),
@@ -168,8 +156,7 @@ class UserCreateAdminForm(UserCreationForm):
Fieldset(
_("Adresse postale"),
Column(
- "addr_appt",
- css_class="col-lg-2 col-md-3 col-xs-6",
+ "addr_appt", css_class="col-lg-2 col-md-3 col-xs-6",
),
Column(
"addr_building",
@@ -179,16 +166,11 @@ class UserCreateAdminForm(UserCreationForm):
"addr_street",
css_class="col-lg-8 col-md-6 col-xs-12",
),
+ Column("addr_city", css_class="col-lg-6 col-md-12"),
Column(
- "addr_city", css_class="col-lg-6 col-md-12"
- ),
- Column(
- "addr_city_code",
- css_class="col-lg-3 col-md-12",
- ),
- Column(
- "addr_dept", css_class="col-lg-3 col-md-12"
+ "addr_city_code", css_class="col-lg-3 col-md-12",
),
+ Column("addr_dept", css_class="col-lg-3 col-md-12"),
Column("addr_country", css_class="col-lg-12"),
css_class="col-lg-12",
),
@@ -199,9 +181,7 @@ class UserCreateAdminForm(UserCreationForm):
"Source",
Row(
Column(
- "bdsource",
- css_class="col-md-6 col-xs-12",
- readonly=True,
+ "bdsource", css_class="col-md-6 col-xs-12", readonly=True,
),
Column(
"id_bdsource",
@@ -216,11 +196,7 @@ class UserCreateAdminForm(UserCreationForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -286,11 +262,7 @@ class UserCreateForm(UserCreationForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -309,20 +281,13 @@ class UserCreateForm(UserCreationForm):
Fieldset(
_("Identité"),
Row(
+ Column("email", css_class="col-xs-12 col-lg-6"),
+ Column("organism", css_class="col-xs-12 col-lg-6",),
Column(
- "email", css_class="col-xs-12 col-lg-6"
- ),
- Column(
- "organism",
- css_class="col-xs-12 col-lg-6",
+ "first_name", css_class="col-xs-12 col-lg-6",
),
Column(
- "first_name",
- css_class="col-xs-12 col-lg-6",
- ),
- Column(
- "last_name",
- css_class="col-xs-12 col-lg-6",
+ "last_name", css_class="col-xs-12 col-lg-6",
),
),
Row(
@@ -354,8 +319,7 @@ class UserCreateForm(UserCreationForm):
Fieldset(
_("Adresse postale"),
Column(
- "addr_appt",
- css_class="col-lg-2 col-md-3 col-xs-6",
+ "addr_appt", css_class="col-lg-2 col-md-3 col-xs-6",
),
Column(
"addr_building",
@@ -365,16 +329,11 @@ class UserCreateForm(UserCreationForm):
"addr_street",
css_class="col-lg-8 col-md-6 col-xs-12",
),
+ Column("addr_city", css_class="col-lg-6 col-md-12"),
Column(
- "addr_city", css_class="col-lg-6 col-md-12"
- ),
- Column(
- "addr_city_code",
- css_class="col-lg-3 col-md-12",
- ),
- Column(
- "addr_dept", css_class="col-lg-3 col-md-12"
+ "addr_city_code", css_class="col-lg-3 col-md-12",
),
+ Column("addr_dept", css_class="col-lg-3 col-md-12"),
Column("addr_country", css_class="col-lg-12"),
css_class="col-lg-12",
),
@@ -385,9 +344,7 @@ class UserCreateForm(UserCreationForm):
"Source",
Row(
Column(
- "bdsource",
- css_class="col-md-6 col-xs-12",
- readonly=True,
+ "bdsource", css_class="col-md-6 col-xs-12", readonly=True,
),
Column(
"id_bdsource",
@@ -402,11 +359,7 @@ class UserCreateForm(UserCreationForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -486,11 +439,7 @@ class UserUpdateAdminForm(forms.ModelForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -509,9 +458,7 @@ class UserUpdateAdminForm(forms.ModelForm):
Fieldset(
_("Caractéristiques principales"),
Column("email", css_class="col-xs-12 col-lg-6"),
- Column(
- "organism", css_class="col-xs-12 col-lg-6"
- ),
+ Column("organism", css_class="col-xs-12 col-lg-6"),
Column(
"username",
css_class="col-xs-12 col-sm-12 col-lg-4",
@@ -529,20 +476,17 @@ class UserUpdateAdminForm(forms.ModelForm):
Fieldset(
_("Responsabilité et autorisations"),
Column(
- "is_resp",
- css_class="col-xs-12 col-md-3 col-lg-2",
+ "is_resp", css_class="col-xs-12 col-md-3 col-lg-2",
),
Column(
"resp_territory",
css_class="col-xs-12 col-md-9 col-lg-10",
),
Column(
- "access_all_data",
- css_class="col-xs-12 col-lg-6",
+ "access_all_data", css_class="col-xs-12 col-lg-6",
),
Column(
- "edit_all_data",
- css_class="col-xs-12 col-lg-6",
+ "edit_all_data", css_class="col-xs-12 col-lg-6",
),
Column("catchauth", css_class="col-lg-12"),
css_class="col-lg-12",
@@ -563,8 +507,7 @@ class UserUpdateAdminForm(forms.ModelForm):
Fieldset(
_("Adresse postale"),
Column(
- "addr_appt",
- css_class="col-lg-2 col-md-3 col-xs-6",
+ "addr_appt", css_class="col-lg-2 col-md-3 col-xs-6",
),
Column(
"addr_building",
@@ -574,16 +517,11 @@ class UserUpdateAdminForm(forms.ModelForm):
"addr_street",
css_class="col-lg-8 col-md-6 col-xs-12",
),
+ Column("addr_city", css_class="col-lg-6 col-md-12"),
Column(
- "addr_city", css_class="col-lg-6 col-md-12"
- ),
- Column(
- "addr_city_code",
- css_class="col-lg-3 col-md-12",
- ),
- Column(
- "addr_dept", css_class="col-lg-3 col-md-12"
+ "addr_city_code", css_class="col-lg-3 col-md-12",
),
+ Column("addr_dept", css_class="col-lg-3 col-md-12"),
Column("addr_country", css_class="col-lg-12"),
css_class="col-lg-12",
),
@@ -594,9 +532,7 @@ class UserUpdateAdminForm(forms.ModelForm):
"Source",
Row(
Column(
- "bdsource",
- css_class="col-md-6 col-xs-12",
- readonly=True,
+ "bdsource", css_class="col-md-6 col-xs-12", readonly=True,
),
Column(
"id_bdsource",
@@ -611,11 +547,7 @@ class UserUpdateAdminForm(forms.ModelForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -639,9 +571,7 @@ class UserAdminUpdatePasswordForm(forms.ModelForm):
password
"""
- error_messages = {
- "password_mismatch": _("The two password fields didn't match.")
- }
+ error_messages = {"password_mismatch": _("The two password fields didn't match.")}
new_password1 = forms.CharField(
label=_("New password"),
widget=forms.PasswordInput,
@@ -649,9 +579,7 @@ class UserAdminUpdatePasswordForm(forms.ModelForm):
help_text=password_validation.password_validators_help_text_html(),
)
new_password2 = forms.CharField(
- label=_("New password confirmation"),
- strip=False,
- widget=forms.PasswordInput,
+ label=_("New password confirmation"), strip=False, widget=forms.PasswordInput,
)
class Meta:
@@ -694,8 +622,7 @@ class UserAdminUpdatePasswordForm(forms.ModelForm):
if password1 and password2:
if password1 != password2:
raise forms.ValidationError(
- self.error_messages["password_mismatch"],
- code="password_mismatch",
+ self.error_messages["password_mismatch"], code="password_mismatch",
)
password_validation.validate_password(password2)
return password2
@@ -750,17 +677,12 @@ class UserUpdateForm(forms.ModelForm):
Fieldset(
_("Caractéristiques principales"),
Row(
+ Column("email", css_class="col-xs-12 col-md-12 col-lg-4",),
Column(
- "email",
- css_class="col-xs-12 col-md-12 col-lg-4",
+ "first_name", css_class="col-xs-12 col-md-6 col-lg-4",
),
Column(
- "first_name",
- css_class="col-xs-12 col-md-6 col-lg-4",
- ),
- Column(
- "last_name",
- css_class="col-xs-12 col-md-6 col-lg-4",
+ "last_name", css_class="col-xs-12 col-md-6 col-lg-4",
),
Field("username", type="hidden"),
),
@@ -768,21 +690,13 @@ class UserUpdateForm(forms.ModelForm):
Fieldset(
_("Responsabilité et autorisations"),
Row(
- Column(
- "is_resp",
- css_class="col-xs-12 col-md-3 col-lg-2",
- ),
+ Column("is_resp", css_class="col-xs-12 col-md-3 col-lg-2",),
Column(
"resp_territory",
css_class="col-xs-12 col-md-9 col-lg-10",
),
- Column(
- "access_all_data",
- css_class="col-xs-12 col-lg-6",
- ),
- Column(
- "edit_all_data", css_class="col-xs-12 col-lg-6"
- ),
+ Column("access_all_data", css_class="col-xs-12 col-lg-6",),
+ Column("edit_all_data", css_class="col-xs-12 col-lg-6"),
Column("catchauth", css_class="col-lg-12"),
),
),
@@ -796,21 +710,13 @@ class UserUpdateForm(forms.ModelForm):
),
Fieldset(
_("Adresse postale"),
+ Column("addr_appt", css_class="col-lg-2 col-md-3 col-xs-6"),
Column(
- "addr_appt", css_class="col-lg-2 col-md-3 col-xs-6"
- ),
- Column(
- "addr_building",
- css_class="col-lg-2 col-md-3 col-xs-6",
- ),
- Column(
- "addr_street",
- css_class="col-lg-8 col-md-6 col-xs-12",
+ "addr_building", css_class="col-lg-2 col-md-3 col-xs-6",
),
+ Column("addr_street", css_class="col-lg-8 col-md-6 col-xs-12",),
Column("addr_city", css_class="col-lg-6 col-md-12"),
- Column(
- "addr_city_code", css_class="col-lg-3 col-md-12"
- ),
+ Column("addr_city_code", css_class="col-lg-3 col-md-12"),
Column("addr_dept", css_class="col-lg-3 col-md-12"),
Column("addr_country", css_class="col-lg-12"),
),
@@ -872,11 +778,7 @@ class PasswordResetForm(PasswordResetForm):
self.helper.layout = Layout(
"email",
Div(
- Submit(
- "submit",
- "Réinitialiser le mot de passe",
- css_class="button",
- ),
+ Submit("submit", "Réinitialiser le mot de passe", css_class="button",),
HTML('Annuler'),
css_class="text-right",
),
diff --git a/accounts/models.py b/accounts/models.py
index 0b3a1465faa831d6f688c4a49055af63e8d39fd8..288224e777111d133e1ee986d64083ec2b29a4e9 100755
--- a/accounts/models.py
+++ b/accounts/models.py
@@ -82,9 +82,7 @@ class Profile(AbstractBaseUser, PermissionsMixin):
default=False, verbose_name=_("Peut éditer toutes les données")
)
catchauth = models.ManyToManyField(
- 'management.CatchAuth',
- blank=True,
- verbose_name=_("Authorisations de capture"),
+ "management.CatchAuth", blank=True, verbose_name=_("Authorisations de capture"),
)
organism = models.CharField(
max_length=255, blank=True, null=True, verbose_name=_("Organisme")
diff --git a/accounts/tables.py b/accounts/tables.py
index abb20271f60c8b20b8982eb0bfbd16963ba7c5d4..17fd6c6b66ff51d9d73500df85ae78c08a155b95 100644
--- a/accounts/tables.py
+++ b/accounts/tables.py
@@ -6,7 +6,7 @@ from .models import Profile
class ProfileTable(tables.Table):
- ACTIONS = '''
+ ACTIONS = """
- '''
+ """
MODIFY_BY = """
{% if record.updated_by %}{{record.updated_by}}{% else %}{{ record.created_by }}{% endif %}
"""
- is_resp = tables.BooleanColumn(verbose_name=_('Responsable local'))
- access_all_data = tables.BooleanColumn(verbose_name=_('Peut tout lire'))
- edit_all_data = tables.BooleanColumn(verbose_name=_('Peut tout éditer'))
- mobile_phone = tables.Column(verbose_name=_('n° mobile'))
- home_phone = tables.Column(verbose_name=_('n° domicile'))
- email = tables.EmailColumn(verbose_name=_('@email'))
+ is_resp = tables.BooleanColumn(verbose_name=_("Responsable local"))
+ access_all_data = tables.BooleanColumn(verbose_name=_("Peut tout lire"))
+ edit_all_data = tables.BooleanColumn(verbose_name=_("Peut tout éditer"))
+ mobile_phone = tables.Column(verbose_name=_("n° mobile"))
+ home_phone = tables.Column(verbose_name=_("n° domicile"))
+ email = tables.EmailColumn(verbose_name=_("@email"))
actions = tables.TemplateColumn(
- ACTIONS, verbose_name="Actions", orderable=False, attrs={'th': {'style': 'width: 75px;'}})
- username = tables.LinkColumn('accounts:user_detail', args=[A('id')], accessor='username')
+ ACTIONS,
+ verbose_name="Actions",
+ orderable=False,
+ attrs={"th": {"style": "width: 75px;"}},
+ )
+ username = tables.LinkColumn(
+ "accounts:user_detail", args=[A("id")], accessor="username"
+ )
modify_by = tables.TemplateColumn(
- MODIFY_BY, verbose_name="Dernière modification", orderable=False)
+ MODIFY_BY, verbose_name="Dernière modification", orderable=False
+ )
last_login = tables.DateTimeColumn()
class Meta:
model = Profile
- template = 'table_bootstrap.html'
- attrs = {'class': 'table table-striped'}
+ template = "table_bootstrap.html"
+ attrs = {"class": "table table-striped"}
fields = (
- 'actions', 'username', 'email', 'first_name', 'last_name', 'organism', 'is_active', 'is_resp',
- 'access_all_data',
- 'edit_all_data', 'home_phone', 'mobile_phone', 'addr_city', 'last_login', 'modify_by',)
- exclude = ('id',)
+ "actions",
+ "username",
+ "email",
+ "first_name",
+ "last_name",
+ "organism",
+ "is_active",
+ "is_resp",
+ "access_all_data",
+ "edit_all_data",
+ "home_phone",
+ "mobile_phone",
+ "addr_city",
+ "last_login",
+ "modify_by",
+ )
+ exclude = ("id",)
diff --git a/accounts/urls.py b/accounts/urls.py
index 4c30a03f11aec0048bed5d2e38a011f36f34db1f..4f9210a68ed32c4928f3328074c61c4fe4b7a8f7 100644
--- a/accounts/urls.py
+++ b/accounts/urls.py
@@ -24,7 +24,11 @@ urlpatterns = [
path("/detail", UserDetail.as_view(), name="user_detail"),
path("myprofile/change_password", change_password, name="change_password"),
path("myprofile/detail", MyProfileDetail.as_view(), name="myprofile_detail"),
- path("myprofile/detail/export", MyProfileDetailExport.as_view(), name="myprofile_detail_export"),
+ path(
+ "myprofile/detail/export",
+ MyProfileDetailExport.as_view(),
+ name="myprofile_detail_export",
+ ),
path("myprofile/update", MyProfileUpdate.as_view(), name="myprofile_update"),
path("list", UserListView.as_view(), name="user_search"),
]
diff --git a/accounts/views.py b/accounts/views.py
index 890a37a46fe6cf932e0da9e9c19d964d8213c1fb..786c70a2b7c4db7709a4405ab4c1dd0a1064df94 100755
--- a/accounts/views.py
+++ b/accounts/views.py
@@ -31,6 +31,7 @@ from .tables import ProfileTable
logger = logging.getLogger(__name__)
+
class UserCreate(ManageAccountAuthMixin, CreateView):
"""
User Creation View
@@ -185,9 +186,7 @@ class MyProfileUpdate(ManageMyAccountAuthMixin, UpdateView):
return super(MyProfileUpdate, self).form_valid(form)
def get_object(self):
- return get_user_model().objects.get(
- id=self.request.user.id
- ) # or request.POST
+ return get_user_model().objects.get(id=self.request.user.id) # or request.POST
def get_context_data(self, **kwargs):
context = super(MyProfileUpdate, self).get_context_data(**kwargs)
@@ -214,31 +213,30 @@ class UserDelete(ManageAccountAuthMixin, DeleteView):
class UserDetail(LoginRequiredMixin, DetailView):
model = get_user_model()
template_name = "accounts/profile.html"
-
+
+
class MyProfileDetail(LoginRequiredMixin, DetailView):
model = get_user_model()
template_name = "accounts/profile.html"
def get_object(self):
logger.info(self.request.user.id)
- return get_user_model().objects.get(
- id=self.request.user.id
- )
+ return get_user_model().objects.get(id=self.request.user.id)
+
-class MyProfileDetailExport(LoginRequiredMixin,DetailView, TemplateResponseMixin):
+class MyProfileDetailExport(LoginRequiredMixin, DetailView, TemplateResponseMixin):
model = get_user_model()
- content_type="text/plain; charset=utf-8"
+ content_type = "text/plain; charset=utf-8"
template_name = "accounts/personnal_data.txt"
def get_object(self):
logger.debug(self.request.user.id)
profile = get_user_model().objects.get(id=self.request.user.id)
dict = model_to_dict(profile)
- del dict['password']
+ del dict["password"]
return dict
-
@login_required()
def change_password(request):
"""
diff --git a/api/views.py b/api/views.py
index 655d5db923729fa6132fdd0c679ff777a328c6eb..e067e64cdc79209c1a48afa05efce53472d48f51 100755
--- a/api/views.py
+++ b/api/views.py
@@ -98,7 +98,7 @@ class MetaPlaceAutocomplete(LoginRequiredMixin, autocomplete.Select2QuerySetView
def get_queryset(self):
if not self.request.user.is_authenticated:
- return Territory.objects.none
+ return MetaPlace.objects.none
qs = MetaPlace.objects.all()
@@ -108,6 +108,7 @@ class MetaPlaceAutocomplete(LoginRequiredMixin, autocomplete.Select2QuerySetView
| Q(type__descr__icontains=self.q)
| Q(type__code__icontains=self.q)
)
+ print(qs)
return qs
@@ -286,7 +287,10 @@ def metaplaces_as_geojson(request):
Vue permettant la génération d'un fichier geojson listant les métalocalités
"""
metaplaces = MetaPlace.objects.exclude(geom__isnull=True)
- field = ("pk", "name")
+ field = (
+ "pk",
+ "name",
+ )
geojson = serialize("geojson", metaplaces, geometry_field="geom", fields=field)
return HttpResponse(geojson, content_type="application/json")
diff --git a/blog/urls.py b/blog/urls.py
index 68f8af61235cf1626536b84f3c3098b3d011bd11..b12189762282c9f63de504406934418c1571f88b 100755
--- a/blog/urls.py
+++ b/blog/urls.py
@@ -11,4 +11,4 @@ urlpatterns = [
path("actu/add", ActuCreate.as_view(), name="actu_create"),
path("actu//update", ActuUpdate.as_view(), name="actu_update"),
path("actu//delete", ActuDelete.as_view(), name="actu_delete"),
-]
\ No newline at end of file
+]
diff --git a/blog/views.py b/blog/views.py
index 469fb0da49a3d98caffd67a5860487956432ae67..2a4b2a50ad8f7e08b2a768950eef07118e46ff3f 100755
--- a/blog/views.py
+++ b/blog/views.py
@@ -19,10 +19,11 @@ from accounts.models import Profile
# model = Actu
#
+
class ActuCreate(BlogCreateAuthMixin, CreateView):
model = Actu
form_class = ActuForm
- template_name = 'normal_form.html'
+ template_name = "normal_form.html"
def form_valid(self, form):
form.instance.created_by = self.request.user
@@ -31,9 +32,11 @@ class ActuCreate(BlogCreateAuthMixin, CreateView):
def get_context_data(self, **kwargs):
context = super(ActuCreate, self).get_context_data(**kwargs)
- context['icon'] = 'fi-align-left'
- context['title'] = _('Ajout d\'une actualité')
- context['js'] = """
+ context["icon"] = "fi-align-left"
+ context["title"] = _("Ajout d'une actualité")
+ context[
+ "js"
+ ] = """
"""
return context
@@ -41,7 +44,7 @@ class ActuCreate(BlogCreateAuthMixin, CreateView):
class ActuUpdate(BlogModifyAuthMixin, UpdateView):
model = Actu
form_class = ActuForm
- template_name = 'normal_form.html'
+ template_name = "normal_form.html"
def form_valid(self, form):
form.instance.created_by = self.request.user
@@ -49,57 +52,64 @@ class ActuUpdate(BlogModifyAuthMixin, UpdateView):
def get_context_data(self, **kwargs):
context = super(ActuUpdate, self).get_context_data(**kwargs)
- context['icon'] = 'fi-align-left'
- context['title'] = _('Modification d\'une actualité')
- context['js'] = """
+ context["icon"] = "fi-align-left"
+ context["title"] = _("Modification d'une actualité")
+ context[
+ "js"
+ ] = """
"""
return context
class ActuDelete(BlogModifyAuthMixin, DeleteView):
model = Actu
- template_name = 'confirm_delete.html'
- success_url = reverse_lazy('blog:home')
+ template_name = "confirm_delete.html"
+ success_url = reverse_lazy("blog:home")
def get_context_data(self, **kwargs):
context = super(ActuDelete, self).get_context_data(**kwargs)
- context['icon'] = 'fi-trash'
- context['title'] = _('Suppression d\'une actualité')
- context['message_alert'] = _('Êtes-vous certain de vouloir supprimer l\'actualité')
+ context["icon"] = "fi-trash"
+ context["title"] = _("Suppression d'une actualité")
+ context["message_alert"] = _(
+ "Êtes-vous certain de vouloir supprimer l'actualité"
+ )
return context
class ActuDetail(DetailView):
model = Actu
- template_name = 'actu_detail.html'
+ template_name = "actu_detail.html"
def get_context_data(self, **kwargs):
context = super(ActuDetail, self).get_context_data(**kwargs)
- context['icon'] = 'fi-align-left'
- context['js'] = """
+ context["icon"] = "fi-align-left"
+ context[
+ "js"
+ ] = """
"""
return context
+
class ActuList(ListView):
model = Actu
- template_name = 'actu_list.html'
- ordering = '-timestamp_update'
+ template_name = "actu_list.html"
+ ordering = "-timestamp_update"
paginate_by = 3
def get_context_data(self, **kwargs):
context = super(ActuList, self).get_context_data(**kwargs)
- context['icon'] = 'fas fa-info-circle'
- context['title'] = _('Dernières actualités')
- context['sightingsicon'] = 'fi-eye'
- context['sightingscount'] = Sighting.objects.all().count()
- context['sightingstext'] = _('observations')
- context['placesicon'] = 'fi-marker'
- context['placescount'] = Place.objects.all().count()
- context['placestext'] = _('localités')
- context['sessionsicon'] = 'far fa-calendar-alt'
- context['sessionscount'] = Session.objects.all().count()
- context['sessionstext'] = _('sessions')
- context['observersicon'] = 'fi-torsos-all-female'
- context['observerscount'] = Profile.objects.all().count()
- context['observerstext'] = _('observateurs')
- return context
\ No newline at end of file
+ context["icon"] = "fas fa-info-circle"
+ context["title"] = _("Dernières actualités")
+ context["sightingsicon"] = "fi-eye"
+ context["sightingscount"] = Sighting.objects.all().count()
+ context["sightingstext"] = _("observations")
+ context["placesicon"] = "fi-marker"
+ context["placescount"] = Place.objects.all().count()
+ context["placestext"] = _("localités")
+ context["sessionsicon"] = "far fa-calendar-alt"
+ context["sessionscount"] = Session.objects.all().count()
+ context["sessionstext"] = _("sessions")
+ context["observersicon"] = "fi-torsos-all-female"
+ context["observerscount"] = Profile.objects.all().count()
+ context["observerstext"] = _("observateurs")
+ return context
diff --git a/core/js.py b/core/js.py
index 43bbbdf833b2279a0140233c09c6773c32331092..f8a8c0012f5047d04164e736f053c065c2de6212 100644
--- a/core/js.py
+++ b/core/js.py
@@ -46,4 +46,4 @@ TimeInput = """
format: 'HH:mm'
});
});
-"""
\ No newline at end of file
+"""
diff --git a/core/mixins.py b/core/mixins.py
index 217d9b77f408aea02ac3f553e22a316b9d9eb896..def6a17ab34c76d0e563f43d2f32d1d060332266 100644
--- a/core/mixins.py
+++ b/core/mixins.py
@@ -2,7 +2,7 @@
Mixins
"""
-from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin
+from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
class ManageAccountAuthMixin:
@@ -29,8 +29,6 @@ class ManageAccountAuthMixin:
return redirect("core:view_unauth")
-
-
class AdminRequiredMixin(LoginRequiredMixin, UserPassesTestMixin):
def test_func(self):
return self.request.user.is_superuser or self.request.user.is_staff
diff --git a/core/static/css/app.css b/core/static/css/app.css
index f73f27210c79e7968d8b53342619efc0adaa9767..57f4d894b24dbc5a6774038f08d2b72b4a388f98 100755
--- a/core/static/css/app.css
+++ b/core/static/css/app.css
@@ -676,3 +676,7 @@ BS Full screen Modal
.leaflet-control-search.search-load .search-input {
background: url(images/loader.gif) no-repeat center right #fff
}
+
+.form-inline > * {
+ margin:10px 3px !important;
+}
\ No newline at end of file
diff --git a/core/views.py b/core/views.py
index 80435c57ce87cb4956f5cfa74fb22ac52b250b76..16aa1efabba13251bd1e0eeaea22a1a70a1a5f9f 100644
--- a/core/views.py
+++ b/core/views.py
@@ -5,15 +5,18 @@ from .mixins import AdminRequiredMixin
from .functions import version
import os
+
def db_datas():
with connection.cursor() as cursor:
- cursor.execute("SELECT pg_size_pretty( pg_database_size( current_database() ) ), version(), postgis_version()")
+ cursor.execute(
+ "SELECT pg_size_pretty( pg_database_size( current_database() ) ), version(), postgis_version()"
+ )
row = cursor.fetchone()
print(row)
data = {}
- data['database_size']= row[0]
- data['database_pg_version'] = row[1]
- data['database_postgis_version'] = row[2]
+ data["database_size"] = row[0]
+ data["database_pg_version"] = row[1]
+ data["database_postgis_version"] = row[2]
return data
@@ -49,4 +52,3 @@ class SystemInformation(AdminRequiredMixin, TemplateView):
sysinfo = {**server_info, **db_datas()}
context["sysinfo"] = sysinfo
return context
-
diff --git a/dbchiro/settings/base.py b/dbchiro/settings/base.py
index 3c712883e9a15b1cfa1da901a7d7cd84863523b6..ed6b28db839d52e80411001cb3169c0ced9f5302 100755
--- a/dbchiro/settings/base.py
+++ b/dbchiro/settings/base.py
@@ -166,7 +166,7 @@ DEFAULT_FROM_EMAIL = config.EMAIL_DEFAULT_FROM
# RestFramework settings
REST_FRAMEWORK = {
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
- "PAGE_SIZE": 100,
+ "PAGE_SIZE": 1000,
# "DEFAULT_RENDERER_CLASSES": ("rest_framework.renderers.JSONRenderer",),
}
@@ -210,7 +210,6 @@ AUTH_PASSWORD_VALIDATORS = [
{"NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",},
]
-
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
@@ -337,6 +336,5 @@ AUTHENTICATION_BACKENDS = ("django.contrib.auth.backends.ModelBackend",) # defa
INTERNAL_IPS = "127.0.0.1"
-
IMAGE_FILE_TYPES = ["png", "jpg", "jpeg"]
DOCUMENT_FILE_TYPES = ["doc", "docx", "odt", "pdf", "xls", "csv", "xlsx", "ods"]
diff --git a/dbchiro/settings/helper/context_processors.py b/dbchiro/settings/helper/context_processors.py
index abb276d63594da15ba680a7c0208dfedf88e57c2..ac1254545bb8de5d026b27440b1021f03a0a1cbe 100755
--- a/dbchiro/settings/helper/context_processors.py
+++ b/dbchiro/settings/helper/context_processors.py
@@ -5,6 +5,6 @@ from core.functions import version
def site_info(request):
"""Return SITE NAME to frontend"""
return {
- 'SITE_NAME': settings.SITE_NAME,
- 'VERSION' : version(),
+ "SITE_NAME": settings.SITE_NAME,
+ "VERSION": version(),
}
diff --git a/dicts/admin.py b/dicts/admin.py
index 5ed939b0a9d410155d31ba58a74251cca99f6bd7..9bba95501ea01f4f7fa9a450a88ce4c8cc6f4e0e 100755
--- a/dicts/admin.py
+++ b/dicts/admin.py
@@ -14,10 +14,10 @@ class CustomApp(AppConfig):
name = "dicts"
def ready(self):
- models = apps.get_app_config('dicts').get_models()
+ models = apps.get_app_config("dicts").get_models()
for model in models:
admin_class = type("AdminClass", (ListAdminMixin, admin.ModelAdmin), {})
try:
admin.site.register(model, admin_class)
except admin.sites.AlreadyRegistered as e:
- pass
\ No newline at end of file
+ pass
diff --git a/docker-compose.yaml b/docker-compose.yaml
index 031460dd6aad4d6d73d59eba2a8150814776ae38..10a4701387ac09418d746421de183bdcf0e66cd2 100644
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -4,7 +4,7 @@ services:
db:
image: mdillon/postgis:11-alpine
- container_name: dbchiro_db
+ container_name: dbchirodev_db
volumes:
- $POSTGRES_DATA_DIR:/var/lib/postgresql/data
environment:
@@ -14,8 +14,8 @@ services:
dbchiro:
- image: dbchiro/dbchiroweb:alpine
- container_name: dbchiro_app
+ image: dbchiro/dbchiroweb:develop
+ container_name: dbchirodev_app
volumes:
- $DBCHIRO_APP_DIR:/dbchiro
links:
diff --git a/docker-entrypoint-ubuntu.sh b/docker-entrypoint-ubuntu.sh
new file mode 100755
index 0000000000000000000000000000000000000000..53c97455a1fcf412eadf150655f14ca0d0ce5892
--- /dev/null
+++ b/docker-entrypoint-ubuntu.sh
@@ -0,0 +1,198 @@
+#!/bin/sh
+
+echo ""
+echo "dbChiro init_____________________________________________"
+echo ""
+echo " * * * *"
+echo " *** ********** ***"
+echo " ***** ********** *****"
+echo " ******* ********** *******"
+echo " ********** ************ **********"
+echo " ****************************************************"
+echo " ******************************************************"
+echo "********************************************************"
+echo "********************************************************"
+echo "********************************************************"
+echo " ******************************************************"
+echo " ******** ************************ ********"
+echo " ******* * ********* * *******"
+echo " ****** ******* ******"
+echo " ***** ***** *****"
+echo " *** *** ***"
+echo " ** * **"
+echo ""
+
+
+export DBHOST=${POSTGRES_HOST:-db}
+export DBNAME=${POSTGRES_DB:-dbchiro}
+export DBUSER=${POSTGRES_USER:-dbadmin}
+export DBPWD=${POSTGRES_PASSWORD:-myDbPassword}
+export DBPORT=${POSTGRES_PORT:-5432}
+export SECRETKEY=${SECRETKEY:-$(< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c50)}
+export SRID=${SRID:-4326}
+export X=${DEFAULT_X:-5}
+export Y=${DEFAULT_Y:-45}
+export SETTINGS=${SETTINGS:-production}
+
+export SU_USERNAME=${SU_USERNAME:-admin}
+export SU_PWD=${SU_PWD:-admin}
+export SU_EMAIL=${SU_EMAIL:-admin@domain.tld}
+
+export EMAIL_SMTP=${EMAIL_SMTP:-smtp.domain.tld}
+export EMAIL_SSL=${EMAIL_SSL:-False}
+export EMAIL_PORT=${EMAIL_PORT:-465}
+export EMAIL_USER=${EMAIL_USER:-$SU_EMAIL}
+export EMAIL_PWD=${EMAIL_PWD:-passWord}
+export EMAIL_DEFAULT_FROM=${EMAIL_SMTP:-$EMAIL_USER}
+
+export IGN_API_KEY=${IGN_API_KEY:-yourapikey}
+
+shopt -s dotglob nullglob
+mv /usr/src/dbchiro/* /app/
+
+if [ ! -f /dbchiro/config.py ]; then
+ echo "generate new config file"
+ mv /app/dbchiro/settings/configuration/config.py.sample /dbchiro/config.py
+ sed -i "s/dbHost/${DBHOST}/g" /dbchiro/config.py
+ sed -i "s/dbName/${DBNAME}/g" /dbchiro/config.py
+ sed -i "s/dbUser/${DBUSER}/g" /dbchiro/config.py
+ sed -i "s/dbPassword/${DBPWD}/g" /dbchiro/config.py
+ sed -i "s/dbPort/${DBPORT}/g" /dbchiro/config.py
+ sed -i "s/secretKey/${SECRETKEY}/g" /dbchiro/config.py
+ sed -i "s/geoDefaultProj/${SRID}/g" /dbchiro/config.py
+ sed -i "s/geoDefaultX/${X}/g" /dbchiro/config.py
+ sed -i "s/geoDefaultY/${Y}/g" /dbchiro/config.py
+ sed -i "s/emailSmtpHost/${EMAIL_SMTP}/g" /dbchiro/config.py
+ sed -i "s/emailSsl/${EMAIL_SSL}/g" /dbchiro/config.py
+ sed -i "s/emailPort/${EMAIL_PORT}/g" /dbchiro/config.py
+ sed -i "s/emailAddress/${EMAIL_USER}/g" /dbchiro/config.py
+ sed -i "s/emailPassword/${EMAIL_PWD}/g" /dbchiro/config.py
+ sed -i "s/emailDefaultFrom/${EMAIL_DEFAULT_FROM}/g" /dbchiro/config.py
+ sed -i "s/IGN_API_KEY = 'yourapikey'/IGN_API_KEY = '${IGN_API_KEY}'/g" /dbchiro/config.py
+else
+ echo "config file already exists"
+fi
+rm -f /app/dbchiro/settings/configuration/config.py
+ln -s /dbchiro/config.py /app/dbchiro/settings/configuration/config.py
+
+
+djapps="accounts blog dicts geodata management sights"
+if [ ! -d /dbchiro/migrations ]; then
+ echo "Create symlink for migrations dirs"
+ mkdir /dbchiro/migrations
+ for a in $djapps; do
+ echo "create $a migrations symlink"
+ if [ ! -d /dbchiro/migrations/$a ]; then
+ mkdir /dbchiro/migrations/$a
+ else
+ "$a migration dir and symlink already exists"
+ fi
+ done
+else
+ echo "Migrations dir already exists"
+fi
+
+for a in $djapps; do
+ rm -rf /app/$a/migrations
+ ln -s /dbchiro/migrations/$a /app/$a/migrations
+done
+
+if [ ! -d /dbchiro/media ]; then
+ echo "Create media dir"
+ mkdir /dbchiro/media
+else
+ echo "Media dir already exusts"
+fi
+
+rm -rf /app/media
+ln -s /dbchiro/media /app/media
+
+until pg_isready -h $DBHOST -p $DBPORT
+do
+ echo "Awaiting Database container"
+ sleep 1
+done
+sleep 2
+
+cd /app
+
+chown -R www-data:www-data /app
+
+export DJANGO_SETTINGS_MODULE=dbchiro.settings.$SETTINGS
+
+echo "************ Init database ****************"
+
+python3 -m manage makemigrations accounts core blog dicts geodata management sights
+python3 -m manage migrate
+python3 -m manage collectstatic --noinput
+
+
+if [ ! -f /dbchiro/logo_site.png ]; then
+ echo "Create default site logo image"
+ cp /app/static/img/logo_site.png.sample /dbchiro/logo_site.png
+else
+ echo "Site logo already exists"
+fi
+rm -f /app/static/img/logo_site.png
+ln -s /dbchiro/logo_site.png /app/static/img/logo_site.png
+
+echo "************** Create dbChiro SU ******************"
+
+script="
+from accounts.models import Profile;
+
+username = '$SU_USERNAME';
+password = '$SU_PWD';
+email = '$SU_EMAIL';
+
+if Profile.objects.filter(is_superuser=True).count()==0:
+ superuser=Profile.objects.create_user(username, email, password);
+ superuser.is_superuser=True;
+ superuser.save();
+ print('Superuser',username,'created.');
+else:
+ print('One or more Superuser already exists, creation skipped.')
+"
+printf "$script" | python3 manage.py shell
+
+
+echo "************** Populate with initial data ***************"
+
+export countdict=$(printf "from dicts.models import PlacePrecision; print(PlacePrecision.objects.count())" | python3 manage.py shell)
+
+if [ $countdict -eq 0 ]
+ then
+ echo "load dicts data"
+ python3 -m manage loaddata datas/dicts.json
+ rm -f datas/dicts.json
+ echo "dicts data loaded"
+ else
+ echo "dicts data already exists"
+fi
+
+export countterritory=$(printf "from geodata.models import Territory; print(Territory.objects.count())" | python3 manage.py shell)
+
+if [ $countterritory -eq 0 ]
+ then
+ echo "load geo datas, this may take a while..."
+ python3 -m manage loaddata datas/geodata.json.gz
+ rm -f datas/geodata.json.gz
+ echo "geo datas loaded"
+ else
+ echo "geo datas already exists"
+fi
+
+
+#nginx Conf
+echo "************ Configure NGINX ***************"
+rm -f /etc/nginx/conf.d/default.conf
+cp /app/dbchiro/settings/configuration/nginx_dbchiro.conf.sample /etc/nginx/conf.d/dbchiro.conf
+rm -rf /etc/nginx/sites-enabled/*
+sed -i "s/pathToApp/app/g" /etc/nginx/conf.d/dbchiro.conf
+#/etc/init.d/nginx restart
+nginx -g "daemon off;" &
+
+echo "************ Start Gunicorn ***************"
+gunicorn -b 127.0.0.1:8000 dbchiro.wsgi
+
+
diff --git a/docker-entrypoint.sh b/docker-entrypoint.sh
index 1bd1ea1ef8ff09762c85e1cbd8243f4708436a6d..813ef7467145894235b7e745c02af6726e777f4d 100755
--- a/docker-entrypoint.sh
+++ b/docker-entrypoint.sh
@@ -101,7 +101,7 @@ if [ ! -d /dbchiro/media ]; then
echo "Create media dir"
mkdir /dbchiro/media
else
- echo "Media dir already exusts"
+ echo "Media dir already exists"
fi
rm -rf /app/media
@@ -145,13 +145,13 @@ username = '$SU_USERNAME';
password = '$SU_PWD';
email = '$SU_EMAIL';
-if Profile.objects.filter(username=username).count()==0:
+if Profile.objects.filter(is_superuser=True).count()==0:
superuser=Profile.objects.create_user(username, email, password);
superuser.is_superuser=True;
superuser.save();
print('Superuser',username,'created.');
else:
- print('Superuser creation skipped.')
+ print('One or more Superuser already exists, creation skipped.')
"
printf "$script" | python manage.py shell
diff --git a/geodata/models.py b/geodata/models.py
index 551cba320c791bba4631a0a185cee01071377233..0872e86333fc90af3e784940c02beed62596a24b 100755
--- a/geodata/models.py
+++ b/geodata/models.py
@@ -52,11 +52,14 @@ class Municipality(models.Model):
class LandCover(models.Model):
id = models.AutoField(primary_key=True)
code = models.ForeignKey(
- LandCoverCLC, verbose_name=_("Code"), blank=True, null=True, on_delete=models.CASCADE)
+ LandCoverCLC,
+ verbose_name=_("Code"),
+ blank=True,
+ null=True,
+ on_delete=models.CASCADE,
+ )
geom = models.MultiPolygonField(
- srid=settings.GEODATA_SRID,
- verbose_name=_("Géométries"),
- spatial_index=True,
+ srid=settings.GEODATA_SRID, verbose_name=_("Géométries"), spatial_index=True,
)
def __str__(self):
@@ -75,4 +78,3 @@ class Elevation(models.Model):
class Meta:
verbose_name = _("Altitude")
-
diff --git a/management/forms.py b/management/forms.py
index 40d235b321862f727c437f73aa85397935dfc4eb..f6cf29e3dee30b113b3207ebb49e15e5ba48d06f 100644
--- a/management/forms.py
+++ b/management/forms.py
@@ -42,11 +42,7 @@ class StudyForm(forms.ModelForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -67,36 +63,22 @@ class StudyForm(forms.ModelForm):
Column("name", css_class="col-lg-4 col-xs-12"),
Column("year", css_class="col-lg-4 col-xs-6"),
Column(
- "project_manager",
- css_class="col-lg-4 col-xs-6",
- ),
- Column(
- "type_etude", css_class="col-lg-6 col-xs-12"
- ),
- Column(
- "type_espace",
- css_class="col-lg-6 col-xs-12",
+ "project_manager", css_class="col-lg-4 col-xs-6",
),
+ Column("type_etude", css_class="col-lg-6 col-xs-12"),
+ Column("type_espace", css_class="col-lg-6 col-xs-12",),
css_class="col-lg-12",
),
Fieldset(
_("Caractéristiques principales"),
Column(
- "public_funding",
- css_class="col-lg-4 col-xs-6",
- ),
- Column(
- "public_report",
- css_class="col-lg-4 col-xs-6",
- ),
- Column(
- "public_raw_data",
- css_class="col-lg-4 col-xs-6",
+ "public_funding", css_class="col-lg-4 col-xs-6",
),
+ Column("public_report", css_class="col-lg-4 col-xs-6",),
Column(
- "confidential",
- css_class="col-lg-6 col-xs-6",
+ "public_raw_data", css_class="col-lg-4 col-xs-6",
),
+ Column("confidential", css_class="col-lg-6 col-xs-6",),
Column(
"confidential_end_date",
css_class="col-lg-6 col-xs-6",
@@ -112,11 +94,7 @@ class StudyForm(forms.ModelForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -157,11 +135,7 @@ class TransmitterForm(forms.ModelForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -180,31 +154,15 @@ class TransmitterForm(forms.ModelForm):
PrimaryAccordionGroup(
_("Informations principales"),
Row(
+ Column("reference", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("frequency", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("weight", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("autonomy", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("model", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("brand", css_class="col-lg-4 col-md-6 col-xs-12"),
+ Column("buying_date", css_class="col-lg-6 col-md-6 col-xs-12",),
Column(
- "reference", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "frequency", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "weight", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "autonomy", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "model", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "brand", css_class="col-lg-4 col-md-6 col-xs-12"
- ),
- Column(
- "buying_date",
- css_class="col-lg-6 col-md-6 col-xs-12",
- ),
- Column(
- "last_recond_date",
- css_class="col-lg-6 col-md-6 col-xs-12",
+ "last_recond_date", css_class="col-lg-6 col-md-6 col-xs-12",
),
),
Row(
@@ -218,11 +176,7 @@ class TransmitterForm(forms.ModelForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -265,11 +219,7 @@ class CatchAuthForm(forms.ModelForm):
self.helper.layout = Layout(
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
@@ -285,9 +235,7 @@ class CatchAuthForm(forms.ModelForm):
"Données de l'arrêté",
Row(
Column("territory", css_class="col-lg-6 col-xs-12"),
- Column(
- "official_reference", css_class="col-lg-6 col-xs-12"
- ),
+ Column("official_reference", css_class="col-lg-6 col-xs-12"),
Column("date_start", css_class="col-lg-6 col-xs-12"),
Column("date_end", css_class="col-lg-6 col-xs-12"),
),
@@ -298,11 +246,7 @@ class CatchAuthForm(forms.ModelForm):
),
Row(
Column(
- Submit(
- "submit",
- _("Enregistrer"),
- css_class="btn-primary btn-sm",
- ),
+ Submit("submit", _("Enregistrer"), css_class="btn-primary btn-sm",),
Button(
"cancel",
_("Annuler"),
diff --git a/management/models.py b/management/models.py
index b6d06fa65ce0ff97e891847b20a6bf032a7fe053..ba81cffd6f8e954a9baefa17bf40b1b377d5d3ba 100755
--- a/management/models.py
+++ b/management/models.py
@@ -15,17 +15,13 @@ class CatchAuth(models.Model):
related_name="catchauth",
)
date_start = models.DateField(
- verbose_name=_("Date de début d'application"),
- help_text=_("format jj/mm/aaaa"),
+ verbose_name=_("Date de début d'application"), help_text=_("format jj/mm/aaaa"),
)
date_end = models.DateField(
- verbose_name=_("Date de fin d'application"),
- help_text=_("format jj/mm/aaaa"),
+ verbose_name=_("Date de fin d'application"), help_text=_("format jj/mm/aaaa"),
)
official_reference = models.CharField(
- max_length=255,
- unique=True,
- verbose_name=_("Référence du texte officiel"),
+ max_length=255, unique=True, verbose_name=_("Référence du texte officiel"),
)
file = models.FileField(
upload_to="catchauth/%Y/",
@@ -42,7 +38,7 @@ class CatchAuth(models.Model):
db_index=True,
editable=False,
related_name="catchauth_creator",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
updated_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
@@ -51,7 +47,7 @@ class CatchAuth(models.Model):
db_index=True,
editable=False,
related_name="catchauth_modifier",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
def __str__(self):
@@ -75,9 +71,7 @@ class Study(models.Model):
max_length=255, db_index=True, verbose_name="nom du l'étude"
)
year = models.CharField(
- max_length=10,
- db_index=True,
- verbose_name="Année de réalisation l'étude",
+ max_length=10, db_index=True, verbose_name="Année de réalisation l'étude",
)
project_manager = models.ForeignKey(
settings.AUTH_USER_MODEL,
@@ -86,7 +80,7 @@ class Study(models.Model):
related_name="study",
null=True,
blank=True,
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
# study_organism = models.ForeignKey(
# 'Organism',
@@ -111,9 +105,7 @@ class Study(models.Model):
type_espace = models.CharField(
max_length=255, blank=True, null=True, verbose_name="Type d'espace"
)
- comment = models.TextField(
- blank=True, null=True, verbose_name="Commentaire"
- )
+ comment = models.TextField(blank=True, null=True, verbose_name="Commentaire")
timestamp_create = models.DateTimeField(auto_now_add=True, editable=False)
timestamp_update = models.DateTimeField(auto_now=True, editable=False)
created_by = models.ForeignKey(
@@ -123,7 +115,7 @@ class Study(models.Model):
db_index=True,
editable=False,
related_name="study_creator",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
updated_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
@@ -132,7 +124,7 @@ class Study(models.Model):
db_index=True,
editable=False,
related_name="study_modifier",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
def __str__(self):
@@ -170,9 +162,7 @@ class Transmitter(models.Model):
max_length=30, unique=True, null=True, verbose_name="Référence"
)
frequency = models.FloatField(null=True, verbose_name="Fréquence en MHz")
- weight = models.FloatField(
- null=True, blank=True, verbose_name="Poids (en grammes)"
- )
+ weight = models.FloatField(null=True, blank=True, verbose_name="Poids (en grammes)")
autonomy = models.FloatField(
null=True, blank=True, verbose_name="Autonomie (en jours)"
)
@@ -185,24 +175,17 @@ class Transmitter(models.Model):
owner = models.CharField(
max_length=100, null=True, blank=True, verbose_name="Propriétaire"
)
- buying_date = models.DateField(
- null=True, blank=True, verbose_name="Date d'achat"
- )
+ buying_date = models.DateField(null=True, blank=True, verbose_name="Date d'achat")
last_recond_date = models.DateField(
null=True, blank=True, verbose_name="Date de dernier reconditionnement"
)
status = models.CharField(
- max_length=50,
- choices=TRANSMITTER_STATUS,
- default="ok",
- verbose_name="Statut",
+ max_length=50, choices=TRANSMITTER_STATUS, default="ok", verbose_name="Statut",
)
available = models.BooleanField(
verbose_name="Disponible pour la saisie", default=True
)
- comment = models.TextField(
- blank=True, null=True, verbose_name="Commentaire"
- )
+ comment = models.TextField(blank=True, null=True, verbose_name="Commentaire")
timestamp_create = models.DateTimeField(auto_now_add=True, editable=False)
timestamp_update = models.DateTimeField(auto_now=True, editable=False)
created_by = models.ForeignKey(
@@ -212,7 +195,7 @@ class Transmitter(models.Model):
db_index=True,
editable=False,
related_name="transmitter_creator",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
updated_by = models.ForeignKey(
settings.AUTH_USER_MODEL,
@@ -221,7 +204,7 @@ class Transmitter(models.Model):
db_index=True,
editable=False,
related_name="transmitter_modifier",
- on_delete=models.SET_NULL
+ on_delete=models.SET_NULL,
)
def __str__(self):
diff --git a/management/tables.py b/management/tables.py
index 1022552d7563d32094515baac834bebac7f5750b..3caf985ffbc68c98e546a54033ed96e7bb75d3ba 100644
--- a/management/tables.py
+++ b/management/tables.py
@@ -4,7 +4,7 @@ from .models import Study, Transmitter, CatchAuth
class StudyTable(tables.Table):
- ACTIONS = '''
+ ACTIONS = """
- '''
- actions = tables.TemplateColumn(
- ACTIONS, verbose_name="Actions", orderable=False)
+ """
+ actions = tables.TemplateColumn(ACTIONS, verbose_name="Actions", orderable=False)
class Meta:
model = Study
- template = 'table_bootstrap.html'
- attrs = {'class': 'table table-striped table-condensed'}
- fields = ('actions', 'name', 'year', 'project_manager', 'type_etude', 'type_espace',
- 'public_funding', 'public_report', 'public_raw_data', 'confidential', 'confidential_end_data',
- 'timestamp_create', 'timestamp_update', 'created_by', 'comment')
+ template = "table_bootstrap.html"
+ attrs = {"class": "table table-striped table-condensed"}
+ fields = (
+ "actions",
+ "name",
+ "year",
+ "project_manager",
+ "type_etude",
+ "type_espace",
+ "public_funding",
+ "public_report",
+ "public_raw_data",
+ "confidential",
+ "confidential_end_data",
+ "timestamp_create",
+ "timestamp_update",
+ "created_by",
+ "comment",
+ )
class TransmitterTable(tables.Table):
- ACTIONS = '''
+ ACTIONS = """
- '''
- COMMENT = '''
+ """
+ COMMENT = """
{% if record.comment %}