# Gargantext Annotations web application

## Install dependencies

(2016-05-11) Instead of the previously "npm-installable" structure, all the libraries are now permanently installed outside of the app 'annotations', directly in the 'static' dir of the entire gargantext project.

Initial version specifications of the dependencies are:
  - "angular": "~1.2.x",
  - "angular-cookies": "~1.2.x",
  - "angular-loader": "~1.2.x",
  - "angular-resource": "~1.2.x",
  - "bootstrap": "~3.x",
  - "angular-cookies": "1.2",
  - "bootstrap-select": "silviomoreto/bootstrap-select#~1.7.3"
  - "underscore": "1.5.2"

These dependencies are imported via annotations/main.js (js) and main.html (css).

## Directory Layout


The layout is :

```
├── __init__.py
├── README.md
├── static
│   └── annotations
│       ├── activelists.js
│       ├── app.css
│       ├── app.js
│       ├── document.js
│       ├── highlight.js
│       ├── http.js
│       ├── keyword_tpl.html
│       ├── main.js
│       ├── ngramlist.js
│       └── utils.js
├── templates
│   └── annotations
│       └── main.html
├── urls.py
└── views.py

```


# Conception and workflow documentation

## TODO : à traduire en anglais

Cette API permet d'éditer les mots-clés miamlistés ou stoplistés associé à un document affiché dans un cadre d'une page web permettant de naviguer à travers un ensemble de document d'un corpus.

### Architecture

- Templates : Django et Angular.js ?
- Communication entre les modules : évènements Angular ($emit et $broadcast)
- Pas de routage entre différentes URL, car ici une seule vue principale basée sur le template django corpus.html
- Modèle d'abstraction de données : côté client (Angular Scopes) et côté serveur (Django Model et SQLAlchemy)
- Composants : TODO lister et décrire les composants client et serveur
- Structure de l'application : organisation du client et du serveur
- Style : Bootstrap et un thème spécifique choisi pour Gargantext
- Gestion des dépendances :
  - bower, npm pour le développement web et les tests côté client
  - pip requirements pour le côté serveur

## Quelles actions execute l'API ?

- afficher le titre, les auteurs, le résumé, la date de publication et le corps d'un document.
- lecture des mots-clés miamlistés associés à un document (dans le texte et hors du texte).
- lecture des mots-clés stoplistés associés à un document (dans le texte et hors du texte).
- lecture des documents ayant le plus de mots-clés miamlistés associés identiques pour afficher une liste de liens vers de nouveaux documents
- lecture du groupe de mots-clés auquel appartient un mot-clé (synonymes, différentes formes)
- modification du groupe de mots-clés auquel appartient un mot-clé donné

On désigne par mot-clé un NGram.

## Schéma de l'API

Liste des endpoints

### Lecture des données

- POST '^api/nodes/(\d+)/children/queries$' : liste des NGrams d'un document avec la possibilité de filtrer par NGrams
- GET '^api/nodes$' : liste des identifiants de mots-clés filtrés par type (NGram ou autre) pour un identifiant de parent (Document ou autre)
- GET '^api/nodes/(\d+)/ngrams$': liste des termes des mots-clés associés à un Document parent, filtrés par termes
- GET ^api/nodes/(\d+)/children/metadata$ : liste des metadata d'un Node, c'est-à-dire :
  - pour un document : titre, auteur, etc
  - pour un NGram : stoplisté ou miamlisté ?

### Écriture des données

TODO

## Workflow

Nous nous fixons sur cette documentation et spécification de l'API

- en parallèle : développement de l'API et prototypage de l'interface
- le prototypage de l'interface peut modifier l'API si besoin

### Spécifications des fondations de l'interface

- résolutions d'écran
- browsers
- langue: english only
- SEO: aucun ?
- collaboratif : oui, les modifications d'un autre utilisateurs seront notifiées à tous les utilisateurs présent sur le même corpus de documents
- fonctionne offline ?

### Working process

- follow board is updated regularly (https://trello.com/b/96ItkDBS/gargantext-miamlists-and-stoplists)[on Trello]

- calendrier prévisionnel: TODO
- interactions entre les acteurs: emails
- git, branches : branche "elias", `git pull --rebase origin master` réguliers
- prévision des revues de code et de l'interface : TODO

### Plateforme

- Python 3.4
- Django 1.6
- Postgresql 9.3 + HSTORE
- SQLAlchemy
- Bootstrap CSS
- Angular.js

### Outils de qualité de code

- pylint
- jshint (voir .jshintrc)
- indentations : 4 espaces (voir .lvimrc)
- nettoyage automatique des espaces en fin de ligne

## Tests

There are two kinds of tests possible : Unit tests and End to End tests.

- côté client : étudier karma.js et protractor
- définir la stratégie de tests : TODO

## Déploiement

- définir le processus de déploiement
- prévoir un système de monitoring des erreurs du serveur une fois en ligne
    - Sentry ?