PnX-SI / GeoNature-citizen

Portail web d'inventaire citoyen de la biodiversité à destination du grand public
https://pnx-si.github.io/GeoNature-citizen/
GNU Affero General Public License v3.0
19 stars 28 forks source link

[maj] 0.99.3 -> 0.99.4 - Erreur #317

Closed PNPyrenees closed 6 months ago

PNPyrenees commented 2 years ago

Bonjour,

Je viens d'essayer de réaliser une mise à jour de citizen V0.99.3 vers V0.99.4.

Je vous partage ma procédure (en espérant qu'il n'y ai pas de louper dans la restitution des actions)

$ wget https://github.com/PnX-SI/GeoNature-citizen/archive/refs/tags/v0.99.4-dev.zip
$ mv gncitizen gncitizen_old
$ unzip v0.99.4-dev.zip
$ mv GeoNature-citizen-0.99.4-dev gncitizen

# récupération et modification fichier de configuration backend
$ cp  gncitizen_old/config/default_config.toml gncitizen/config/
$ vim gncitizen/config/default_config.toml

Ajouter :
-   Ligne 28 :
o   HCAPTCHA_SECRET_KEY='' (l. 28)
-   Ligne 55 :
NO_VALIDATION_HTML_TEMPLATE = '''<p> Bonjour,</p><br /><p>Nous vous confirmons que votre compte a bien été créé.</p>
     <p>Nous vous souhaitons la bienvenue sur notre site.</p><br />
     <p>Cordialement.</p>
    '''

# récupération et modification fichier de configuration frontend
$ mv gn_citizen/frontend/src/conf/app.config.ts gn_citizen/frontend/src/conf/app.config.ts.OLD
$ cp gn_citizen_old/frontend/src/conf/app.config.ts gn_citizen/frontend/src/conf/app.config.ts
$ vim gn_citizen/frontend/src/conf/app.config.ts

Ajouter :
-   Ligne 5 :
o   HCAPTCHA_SITE_KEY : null
-   Ligne 14 :
o   NEW_OBS_FROM_MODAL_VERSION : true
-   Ligne 60 :
o   taxonDisplayImageWhenUnique : true,
Modifier :
-   Ligne 26
o   Signup : "always"

# Création du dossier media
$ cp -r gncitizen_old/media gncitizen/

# récupération des assets
$ mv gncitizen/frontend/src/asset gncitizen/frontend/src/asset_old
$ cp -r gncitizen_old/frontend/src/asset gncitizen/frontend/src/

# Installation des dépendances
$ sudo apt update && sudo apt -y install python2.7 git gcc curl gunicorn python-setuptools lsb-release apt-transport-https wget
$ sudo apt -y install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev curl libbz2-dev
$ sudo apt -y install apache2 python-dev libpq-dev libgeos-dev supervisor unzip virtualenv libcurl4-openssl-dev libssl-dev
$ sudo apt -y install build-essential libglib2.0-0 libsm6 libxext6 libxrender-dev
$ sudo apt install python3 python3-dev python3-pip -y

$ pip3 install --upgrade pip
$ python3 -m pip install poetry --user

# Construction du frontend
$ cd gn_citizen/frontend/
$ npm install
$ npm run build
$ cd ..

# Installation des dépendances du backend
$ cd backend/
$ poetry install

$ sudo supervisorctl restart citizen_api

Suite à ça, je rencontre une erreur peu explicite (pour moi) lorsque j'essaye d'afficher la page d'accueil de Citizen. Plus exactement lors de l'appel de la route api/programs qui me retourne :

{
    "message": "<ColumnProperty at 0x7feab8ab7048; is_active>"
}

Je suis bloqué à ce stade. Auriez-vous des pistes de résolution ?

Merci par avance.

PNPyrenees commented 2 years ago

Pour avancer sur la question, j'ai retiré le try et exception dans get_programs() (core/commons/route.py) et activer le DEBUG dans la configuration.

J'en comprend que le problème vient de la fonction suivante :

feature["properties"] = program.as_dict(True)

Voici le détail de l'erreur :

[2021-10-26 07:23:49 +0000] [74616] [ERROR] Error handling request /api/programs
Traceback (most recent call last):
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 136, in handle
    self.handle_request(listener, req, client, addr)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/gunicorn/workers/sync.py", line 179, in handle_request
    respiter = self.wsgi(environ, resp.start_response)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 2450, in wsgi_app
    response = self.handle_exception(e)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 1867, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 2447, in wsgi_app
    response = self.full_dispatch_request()
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 1952, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask_cors/extension.py", line 165, in wrapped_function
    return cors_after_request(app.make_response(f(*args, **kwargs)))
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 1821, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/_compat.py", line 39, in reraise
    raise value
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 1950, in full_dispatch_request
    rv = self.dispatch_request()
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/flask/app.py", line 1936, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/utils_flask_sqla/response.py", line 19, in _json_resp
    res = fn(*args, **kwargs)
  File "/home/citizen/gncitizen/backend/gncitizen/core/commons/routes.py", line 401, in get_programs
    feature["properties"] = program.as_dict(True)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/utils_flask_sqla/serializers.py", line 238, in serializefn
    _columns, _relationships = get_columns_and_relationships(fields, exclude)
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/utils_flask_sqla/serializers.py", line 145, in get_columns_and_relationships
    for key, col in ChainMap(mapper.column_attrs, hybrid_properties).items()
  File "/home/citizen/gncitizen/backend/.venv/lib/python3.6/site-packages/utils_flask_sqla/serializers.py", line 144, in <dictcomp>
    _columns = { key: col
  File "/usr/lib/python3.6/_collections_abc.py", line 744, in __iter__
    yield (key, self._mapping[key])
  File "/usr/lib/python3.6/collections/__init__.py", line 883, in __getitem__
    return self.__missing__(key)            # support subclasses that define __missing__
  File "/usr/lib/python3.6/collections/__init__.py", line 875, in __missing__
    raise KeyError(key)
KeyError: <ColumnProperty at 0x7fb568f73048; is_active>
lpofredc commented 2 years ago

Il semble qu'il y ait un problème avec le champ is_active de la table gnc_core.t_programs, normalement booléen avec une valeur True par défaut.

Pourriez-vous un extrait de cette table?

select distinct id_program, title, is_active from gnc_core.t_programs ;

et son DDL, par exemple avec la commande pg_dump:

pg_dump -s -d <nom de la bdd> -t gnc_core.t_programs

Voici ce que ça devrait donner


CREATE TABLE gnc_core.t_programs (
    id_program integer NOT NULL,
    unique_id_program uuid NOT NULL,
    id_project integer NOT NULL,
    title character varying(50) NOT NULL,
    short_desc character varying(200) NOT NULL,
    long_desc text NOT NULL,
    form_message character varying(500),
    image character varying(250),
    logo character varying(250),
    id_module integer NOT NULL,
    taxonomy_list integer,
    is_active boolean DEFAULT true,
    id_geom integer NOT NULL,
    id_form integer,
    timestamp_create timestamp without time zone NOT NULL,
    timestamp_update timestamp without time zone
);
PNPyrenees commented 2 years ago

Je n'ai rien remarqué d'anormal sur la table mais voici ce que ça me retourne la requête :

id_program title is_active
3 "test 0.99.4" True
2 "TEST-2" False
1 "Test formulaire" False

Et voici la structure de la table gnc_core.t_programs

CREATE TABLE gnc_core.t_programs (
    id_program integer NOT NULL,
    unique_id_program uuid NOT NULL,
    id_project integer NOT NULL,
    title character varying(50) NOT NULL,
    short_desc character varying(200) NOT NULL,
    long_desc text NOT NULL,
    form_message character varying(500),
    image character varying(250),
    logo character varying(250),
    id_module integer NOT NULL,
    taxonomy_list integer,
    is_active boolean DEFAULT true,
    id_geom integer NOT NULL,
    id_form integer,
    timestamp_create timestamp without time zone NOT NULL,
    timestamp_update timestamp without time zone
);
PNPyrenees commented 2 years ago

Pour donner suite, je viens d'essayer une installation automatique. J'ai eu un problème discret lors de l'installation car j'avais préalablement créé la base de données. Elle n'a donc pas été installé mais le processus 'installation à continué. Serait-il possible d'inclure un contrôle en amont vérifiant si la base existe ou non (et la créer seulement si elle n'existe pas). Mettre des point d'arrêt en cas d'erreur serait également un plus car il y a peut-être d'autres erreurs que je n'ai pas vu passer.

Bref, j'ai relancé une installation en supprimant la base de données mais le script rencontre des problèmes lors de l'intégration des données dans ref_geo.

ERROR:  relation "ref_geo.temp_fr_municipalities" does not exist
[...]

ERROR:  syntax error at or near "truncate"

La base se trouve être vierge.

Etant dans une optique de mise à jour, j'ai fait pointer la configuratin vers la base de la précédente version mais je me retrouve avec la même erreur :

CRITICAL in routes: [get_programs] error : <ColumnProperty at 0x7f6e23cda048; is_active>
PNPyrenees commented 2 years ago

Échec également en partant d'une VM vierge (en ubuntu server 18.04 ou 20.04)

Le script d'installation ne me créé pas la base de données et quand je relance le superviseur, il me sort des librairies manquante :

18.04 :

- No module named pathlib
$ pip3 install pathlib

Mais le problème persiste

20.04 :

- No module named flasgger
$ pip install flasgger
- No module named 'flask_admin'
$ pip install flask_admin
-  No module named flask_ckeditor
$ pip install flask_ckeditor
- No madule named flask_jwt_extended
$ pip install flask_jwt_extended
- No madule named flask_sqlalchemy
$ pip install flask_sqlalchemy
- No madule named toml
$ pip install toml
- No madule named flask_cors
$ pip install flask_cors
- No madule named geoalchemy2
$ pip install geoalchemy2
- No madule named utils_flask_sqla_geo
$ pip install utils_flask_sqlalchemy

Le dernier paquet utils_flask_sqlalchemy n'est pas trouvé

Je sèche complet !

QuentinJouet commented 2 years ago

Bonjour,

J'ai un problème similaire en essayant de mettre à jour l'instance utilisée par la LPO isère.

La méthode program.as_dict() lève cette erreur :

KeyError: <ColumnProperty at 0x7fdde7983048; logo>

Avez-vous trouvé une solution ?

camillemonchicourt commented 2 years ago

Je ne sais pas si le soucis est lié, mais je vois que GeoNature-citizen utilise un fork de utils_flask_sqlalchemy qui n'est peut-être pas à jour ou a un soucis : https://github.com/PnX-SI/GeoNature-citizen/blob/master/backend/requirements.txt#L46 ?

mvergez commented 2 years ago

Effectivement bien vu, en Python 3.9, j'avais dû changer le pyproject.toml avec cette ligne utils-flask-sqlalchemy = {git = "https://github.com/PnX-SI/Utils-Flask-SQLAlchemy"}.

Ou lancer la commande poetry add git+https://github.com/PnX-SI/Utils-Flask-SQLAlchemy

camillemonchicourt commented 2 years ago

OK en effet le dépôt officiel dispose d'une version récente compatible Python 3.9 : https://github.com/PnX-SI/Utils-Flask-SQLAlchemy/releases Alors que le fork est resté sur une ancienne version.

Donc il faudrait modifier le requirements.txt pour utiliser le dépôt officiel et non pas le fork.

QuentinJouet commented 2 years ago

Ok merci, mais j'étais en python 3.6, dois-je nécessairement passer en python 3.9 ?

QuentinJouet commented 2 years ago

Ok merci c'est bon, j'ai modifié requirements.txt et gardé python 3.6, le problème est résolu !

camillemonchicourt commented 2 years ago

OK donc à modifier dans la prochaine version, mais avec poetry, je ne sais pas où il faut modifier cela, je laisse les connaisseurs modifier cela pour la prochaine release.

mvergez commented 2 years ago

C'est fait ici : https://github.com/PnX-SI/GeoNature-citizen/pull/321

camillemonchicourt commented 6 months ago

Corrigé dans la 1.0.0