Skip to content

Commit

Permalink
Merge pull request #379 from PnX-SI/dev
Browse files Browse the repository at this point in the history
WIP V1 pre-release
  • Loading branch information
lpofredc authored Mar 12, 2024
2 parents 93472ea + 566b6ef commit c847000
Show file tree
Hide file tree
Showing 136 changed files with 8,173 additions and 24,213 deletions.
42 changes: 42 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
[flake8]
ignore =
E121,
E126,
E127,
E128,
E203,
E225,
E226,
E231,
E241,
E251,
E261,
E265,
E302,
E303,
E305,
E402,
E501,
E741,
W291,
W292,
W293,
W391,
W503,
W504,
F403,
F405,
B007,
B950,
C901,
exclude =
.git,
.venv,
__pycache__,
docs/source/conf.py,
frontend,
node-modules,
build,
dist,
migrations
max-complexity = 10
31 changes: 17 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,18 @@ Documentation : https://geonature-citizen.readthedocs.io
## Cas d'utilisation

- https://obs.mercantour-parcnational.fr
- https://www.a-vos-mares.org/participez/
- http://abc-meylan.lpo-aura.org/obs/home
- http://biodiv-valenceromansagglo.lpo-aura.org
- https://biomap.champs-libres.be/fr/home
- https://gncitizen.lpo-aura.org/fr/home
- https://citizen.nature-occitanie.org/fr/home
- https://phenoclim.org/accueil/individus-phenoclim/
- https://atlasdelabiodiversite.cote-emeraude.fr/fr/home
- https://enquetes.lashf.org/fr/home
- https://biomap.champs-libres.be
- https://gncitizen.lpo-aura.org
- https://citizen.nature-occitanie.org
- https://phenoclim.org/accueil/individus-phenoclim
- https://enquetes.lashf.org
- https://observatoire-biodiversite.parc-du-vercors.fr
- https://enquetes-biodivrennes.fr
- https://enquetes.clicnat.fr
- https://obs-citoyenne.pyrenees-parcnational.fr
- https://observation.lehavre.fr
- https://enquetes.cbiodiv.org
- https://jobservemonparc.fr

## Solutions logicielles

Expand All @@ -48,18 +51,18 @@ Documentation : https://geonature-citizen.readthedocs.io
### Frontend

- NodeJS
- Angular 8
- Angular
- LeafletJS
- Bootstrap 4.1
- Bootstrap 4

### Dépendances

GeoNature-citizen s'appuie sur [TaxHub](https://github.com/PnX-SI/TaxHub) pour la création des listes d'espèces utilisées dans les programmes.
:exclamation: GeoNature-citizen s'appuie sur [TaxHub](https://github.com/PnX-SI/TaxHub) pour la création des listes d'espèces utilisées dans les programmes.

### Installation

- Lancer le script install_app.sh pour installer l'application entière ainsi que ses dépendances (postgres, taxhub ...)
- Au premier lancement le script créera un fichier settings.ini dans config
- Lancer le script install_app.sh pour installer l'application entière ainsi que ses dépendances (postgres ...)
- Au premier lancement le script créera un fichier settings.ini dans le dossier config
- Remplacer toutes les variables par vos données de votre serveur
- Relancer le script install_app.sh
- Les fichiers de conf frontend et backend seront alors créés et configurés
Expand Down
39 changes: 7 additions & 32 deletions backend/gncitizen/core/badges/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,7 @@

from flask import Blueprint, current_app, jsonify
from sqlalchemy.sql.expression import func
from utils_flask_sqla.response import json_resp

from gncitizen.core.commons.models import ProgramsModel
from gncitizen.core.observations.models import ObservationModel
from gncitizen.core.users.models import UserModel
from gncitizen.utils.taxonomy import get_specie_from_cd_nom
Expand All @@ -15,7 +13,6 @@

@badges_api.route("/rewards/<int:id>", methods=["GET"])
def get_rewards(id):

total_obs = 0
program_scores = []
taxon_scores = []
Expand All @@ -28,28 +25,28 @@ def get_rewards(id):
.group_by(ObservationModel.id_program)
.values(
ObservationModel.id_program.label("id"),
func.count(ObservationModel.id_program).label("nb_obs")
func.count(ObservationModel.id_program).label("nb_obs"),
)
)
for item in scores_query:
program_scores.append({"id_program": item.id, "nb_obs": item.nb_obs})
total_obs = total_obs + item.nb_obs

taxon_query = (
ObservationModel.query.filter(ObservationModel.id_role == id)
.group_by(ObservationModel.cd_nom)
.values(
ObservationModel.cd_nom,
func.count(ObservationModel.cd_nom).label("nb_obs")
func.count(ObservationModel.cd_nom).label("nb_obs"),
)
)

classes = {}
families = {}
for query in taxon_query:
taxon = get_specie_from_cd_nom(cd_nom=query.cd_nom)
class_ = taxon.get('classe', '')
family = taxon.get('famille', '')
class_ = taxon.get("classe", "")
family = taxon.get("famille", "")
if classes.get(class_) is not None:
classes[class_] += query.nb_obs
else:
Expand All @@ -58,7 +55,7 @@ def get_rewards(id):
families[family] += query.nb_obs
else:
families[family] = query.nb_obs

for class_, total in classes.items():
taxon_scores.append({"classe": class_, "nb_obs": total})
for family, total in families.items():
Expand All @@ -67,12 +64,9 @@ def get_rewards(id):
user = UserModel.query.filter(UserModel.id_user == id).one()
result = user.as_secured_dict(True)
user_date_create = result["timestamp_create"]
user_date_create = datetime.strptime(
user_date_create, "%Y-%m-%dT%H:%M:%S.%f"
)
user_date_create = datetime.strptime(user_date_create, "%Y-%m-%dT%H:%M:%S.%f")

for reward in rewards:

if reward["type"] == "all_attendance":
id = 1
for badge in reward["badges"]:
Expand Down Expand Up @@ -166,22 +160,3 @@ def monthdelta(d1, d2):
else:
break
return delta


@badges_api.route("/stats", methods=["GET"])
@json_resp
def get_stat():
try:
stats = {}
stats["nb_obs"] = ObservationModel.query.count()
stats["nb_user"] = UserModel.query.count()
stats["nb_program"] = ProgramsModel.query.filter(
ProgramsModel.is_active == True
).count()
stats["nb_espece"] = ObservationModel.query.distinct(
ObservationModel.cd_nom
).count()
return (stats, 200)
except Exception as e:
current_app.logger.critical("[get_observations] Error: %s", str(e))
return {"message": str(e)}, 400
51 changes: 14 additions & 37 deletions backend/gncitizen/core/commons/admin.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
#!/usr/bin/python3
# -*- coding:utf-8 -*-
import requests
from flask import current_app, flash
from flask_admin.contrib.sqla.view import ModelView
from flask_admin.form.upload import FileUploadField
Expand All @@ -9,35 +8,13 @@
from wtforms import SelectField

from gncitizen.core.sites.models import CorProgramSiteTypeModel
from gncitizen.utils.admin import (
CustomJSONField,
CustomTileView,
json_formatter,
)
from gncitizen.utils.env import MEDIA_DIR, taxhub_lists_url
from gncitizen.utils.admin import CustomJSONField, CustomTileView, json_formatter
from gncitizen.utils.env import MEDIA_DIR
from gncitizen.utils.taxonomy import taxonomy_lists

logger = current_app.logger


def taxonomy_lists():
taxonomy_lists = []

taxa_lists = requests.get(taxhub_lists_url)
logger.debug(taxa_lists)
if taxa_lists.status_code == 200:
try:
taxa_lists = taxa_lists.json()["data"]
logger.debug(taxa_lists)
for taxa_list in taxa_lists:
taxonomy_lists.append(
(taxa_list["id_liste"], taxa_list["nom_liste"])
)
except Exception as e:
logger.critical(str(e))
logger.debug(taxonomy_lists)
return taxonomy_lists


class CorProgramSiteTypeModelInlineForm(InlineFormAdmin):
form_columns = ("site_type",)

Expand All @@ -52,7 +29,7 @@ class ProjectView(ModelView):

class ProgramView(ModelView):
form_overrides = {"long_desc": CKEditorField, "taxonomy_list": SelectField}
form_args = {"taxonomy_list": {"choices": taxonomy_lists(), "coerce": int}}
form_args = {"taxonomy_list": {"choices": taxonomy_lists, "coerce": int}}
create_template = "edit.html"
edit_template = "edit.html"
form_excluded_columns = [
Expand All @@ -67,6 +44,16 @@ class ProgramView(ModelView):
"image",
"logo",
]
column_filters = (
"module.label",
"project.name",
"is_active",
)
column_searchable_list = (
"title",
"project.name",
)

inline_models = [
(
CorProgramSiteTypeModel,
Expand All @@ -85,21 +72,11 @@ class CustomFormView(ModelView):
}


class UserView(ModelView):
column_exclude_list = ["password"]
form_excluded_columns = [
"timestamp_create",
"timestamp_update",
"password",
]


def get_geom_file_path(obj, file_data):
return "geometries/{}".format(file_data.filename)


class GeometryView(CustomTileView):
# column_exclude_list = ["geom"]
form_excluded_columns = ["timestamp_create", "timestamp_update"]
column_exclude_list = ["geom", "geom_file"]
form_overrides = dict(geom_file=FileUploadField)
Expand Down
Loading

0 comments on commit c847000

Please sign in to comment.