Skip to content

Commit

Permalink
Merge pull request #402 from hypsug0/fix_issue_399
Browse files Browse the repository at this point in the history
Fix_issue_399
  • Loading branch information
lpofredc committed Mar 28, 2024
2 parents b919fb1 + 59bc220 commit 883b211
Show file tree
Hide file tree
Showing 8 changed files with 106 additions and 15 deletions.
4 changes: 3 additions & 1 deletion backend/gncitizen/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
"""gncitizen __init__ to retrieve VERSION"""

from pathlib import Path

ROOT_DIR = Path(__file__).absolute().parent.parent.parent

with open(str((ROOT_DIR / "VERSION"))) as v:
with open(str((ROOT_DIR / "VERSION")), encoding="utf-8") as v:
__version__ = v.read()
14 changes: 7 additions & 7 deletions backend/gncitizen/core/commons/models.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,37 @@
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""Commons models"""

import json
import os
import uuid
import xml.etree.ElementTree as ET
from datetime import datetime

from flask import url_for
from geoalchemy2 import Geometry
from geoalchemy2.functions import ST_GeomFromGeoJSON, ST_GeomFromKML, ST_SetSRID
from geoalchemy2.shape import to_shape
from geojson import Feature
from gncitizen.utils.env import MEDIA_DIR, db
from sqlalchemy import ForeignKey
from sqlalchemy.dialects.postgresql import JSONB, UUID
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.hybrid import hybrid_method, hybrid_property
from sqlalchemy.orm import relationship
from sqlalchemy.sql import expression
from utils_flask_sqla_geo.serializers import geoserializable, serializable

from gncitizen.utils.env import MEDIA_DIR, db


class TimestampMixinModel(object):
class TimestampMixinModel:
"""Structure commune de suivi des modifications d'une table"""

@declared_attr
def timestamp_create(cls):
def timestamp_create(self):
"""Auto timestamp create"""
return db.Column(db.DateTime, nullable=False, default=datetime.utcnow)

@declared_attr
def timestamp_update(cls):
def timestamp_update(self):
"""Auto timestamp update"""
return db.Column(
db.DateTime,
nullable=True,
Expand Down
8 changes: 6 additions & 2 deletions backend/gncitizen/core/observations/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,14 +33,18 @@ class ObservationView(CustomTileView):
"id_program",
"program_ref.title",
"program_ref.unique_id_program",
"program_ref.project.name",
"program_ref.project.unique_id_project",
"municipality",
)
column_searchable_list = (
"email",
"date",
"program_ref.title",
"program_ref.unique_id_program",
"cd_nom",
"name",
"municipality",
"obs_txt",
"email",
)
can_create = False

Expand Down
81 changes: 81 additions & 0 deletions backend/gncitizen/core/sites/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,85 @@
"""Flask-Admin views for site module"""

from flask_admin.contrib.sqla.view import ModelView
from gncitizen.utils.admin import CustomJSONField, CustomTileView, json_formatter
from markupsafe import Markup

from .models import VisitModel


def _visits_list_formatter(view, context, model, name):
# returns the content of a row in h3 html tags
visits = ", ".join([f"{visit.date}" for visit in model.visits])
return Markup(visits)


class SiteView(CustomTileView):
can_export = True
inline_models = [
VisitModel,
]
column_formatters = {"visits": _visits_list_formatter}
# column_exclude_list = ["geom"]
column_list = [
"id_site",
"name",
"visits",
"site_type.type",
"id_program",
"program.title",
"program.project.name",
"geom",
"timestamp_create",
"timestamp_update",
]
column_filters = (
"name",
"site_type.type",
"program.title",
"program.id_program",
"program.unique_id_program",
"program.project.id_project",
"program.project.name",
"program.project.unique_id_project",
)
column_searchable_list = [
"name",
]
can_create = False


class VisitView(CustomTileView):
can_export = True
form_overrides = {"json_data": CustomJSONField}
column_list = [
"id_visit",
"id_site",
"date",
"json_data",
"obs_txt",
"email",
"site.geom",
"timestamp_create",
"timestamp_update",
]
column_formatters = {
"json_data": json_formatter,
}
column_filters = (
"date",
"site.id_site",
"site.name",
"site.site_type.type",
"site.program.title",
"site.program.id_program",
"site.program.unique_id_program",
"site.program.project.id_project",
"site.program.project.name",
"site.program.project.unique_id_project",
)
column_searchable_list = ["date", "site.name"]
form_excluded_columns = ["timestamp_create", "timestamp_update"]
can_create = False


class SiteTypeView(ModelView):
Expand Down
6 changes: 3 additions & 3 deletions backend/gncitizen/core/sites/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ class SiteModel(TimestampMixinModel, ObserverMixinModel, db.Model):
)

def __repr__(self):
return "<Site {0}>".format(self.id_site)
return f"Site #{self.id_site} - {self.name}"


@serializable
Expand Down Expand Up @@ -97,12 +97,12 @@ class VisitModel(TimestampMixinModel, ObserverMixinModel, db.Model):
id_site = db.Column(
db.Integer, db.ForeignKey(SiteModel.id_site, ondelete="CASCADE"), index=True
)
site = relationship("SiteModel")
site = db.relationship("SiteModel", backref=db.backref("visits"))
date = db.Column(db.Date)
json_data = db.Column(JSONB, nullable=True)

def __repr__(self):
return "<Visit {0}>".format(self.id_visit)
return f"Visit #{self.id_visit}"


class MediaOnVisitModel(TimestampMixinModel, db.Model):
Expand Down
5 changes: 5 additions & 0 deletions backend/gncitizen/core/sites/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,20 @@

from gncitizen.core.commons.models import MediaModel, ProgramsModel
from gncitizen.core.users.models import UserModel
from gncitizen.utils.env import admin
from gncitizen.utils.errors import GeonatureApiError
from gncitizen.utils.jwt import get_id_role_if_exists, get_user_if_exists
from gncitizen.utils.media import save_upload_files
from server import db

from .admin import SiteView, VisitView
from .models import MediaOnVisitModel, SiteModel, SiteTypeModel, VisitModel

sites_api = Blueprint("sites", __name__)

admin.add_view(SiteView(SiteModel, db.session, "Sites", category="Sites"))
admin.add_view(VisitView(VisitModel, db.session, "Visites", category="Sites"))


@sites_api.route("/types", methods=["GET"])
@json_resp
Expand Down
2 changes: 1 addition & 1 deletion backend/gncitizen/utils/geo.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def get_municipality_id_from_wkb(wkb):
i += 1
except Exception as e:
current_app.logger.debug(
"[get_municipality_id_from_wkb_point] Can't get municipality id: {}".format(str(e))
f"[get_municipality_id_from_wkb_point] Can't get municipality id: {str(e)}"
)
raise
return f"{municipality_name} ({municipality_code})"
Expand Down
1 change: 0 additions & 1 deletion backend/gncitizen/utils/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ def set_media_links(item: Row) -> dict:
def get_filter_by_args(model_class: db.Model, dict_args: dict):
filters = []
for key, value in dict_args.items():
print(f"KEY {key}") # type: str, any
if key.endswith("__gt"):
key = key[:-4]
filters.append(getattr(model_class, key) > value)
Expand Down

0 comments on commit 883b211

Please sign in to comment.