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 %} - - - {% endif %} - {{ counttitle }} : {{ count }} + {% if count %} +
+
+ {% if export %} +
+ + +
+ {% endif %} + {{ counttitle }} : {{ count }} +
+ {% endif %} + +
+ {# {% render_table table %}#} + + + + + + + + + + + + + + + +
+ActionsEspèceEffectifColonie de reproductionLocalitéDateSessionContactCréation
- {% endif %} + + {% if filter %} @@ -526,7 +525,7 @@ {% endif %}
- {% leaflet_map "main" %} +