Skip to content

Commit

Permalink
Merge pull request #97 from KIClubinfo/dev
Browse files Browse the repository at this point in the history
Release Pochtron
  • Loading branch information
LudovicDrtt authored Sep 12, 2022
2 parents 9f061ba + 5ec9718 commit 557fc79
Show file tree
Hide file tree
Showing 87 changed files with 3,737 additions and 187 deletions.
1 change: 1 addition & 0 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ [email protected]
DEFAULT_FROM_EMAIL=[email protected]
SECRET_KEY=ChangeThatPlease
DEBUG=True
DOMAIN_NAME=upont.enpc.org
GUNICORN_NB_WORKERS=10
SECURE_SSL_REDIRECT=False
REMOTE_STATIC_STORAGE=False
Expand Down
12 changes: 11 additions & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ on:
branches:
- master
jobs:
test:
test-dev:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
Expand All @@ -15,3 +15,13 @@ jobs:
run: docker-compose up -d
- name: Run tests
run: docker-compose exec -T back python manage.py test
test-prod:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Build containers
run: bash scripts/build.sh
- name: Start containers
run: bash scripts/start.sh
- name: Run tests
run: docker-compose exec -T back python manage.py test
16 changes: 10 additions & 6 deletions .github/workflows/super-linter.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# This workflow executes several linters on changed files based on languages used in your code base whenever
# you push a code or open a pull request.
#
# This workflow executes several linters on changed files based on languages
# used in your code base whenever you push a code or open a pull request.
# You can adjust the behavior by modifying this file.
# For more information, see:
# https://github.com/github/super-linter
---
name: Lint Code Base

on:
push:
branches: [ master ]
branches: [master]
pull_request:
jobs:
run-lint:
Expand All @@ -17,7 +17,8 @@ jobs:
- name: Checkout code
uses: actions/checkout@v2
with:
# Full git history is needed to get a proper list of changed files within `super-linter`
# Full git history is needed to get a proper list of changed files
# within `super-linter`
fetch-depth: 0

- name: Lint Code Base
Expand All @@ -26,11 +27,14 @@ jobs:
VALIDATE_ALL_CODEBASE: false
DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
FILTER_REGEX_EXCLUDE:
- docker-compose.yml
- docker-compose_prod.yml
VALIDATE_HTML: false
VALIDATE_JSCPD: false
VALIDATE_CSS: false
VALIDATE_MARKDOWN: false
VALIDATE_NATURAL_LANGUAGE: false
VALIDATE_BASH : false
VALIDATE_BASH: false
VALIDATE_BASH_EXEC: false
VALIDATE_ENV: false
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,6 @@
.idea
media
populate.json
.vscode/
backups/
back/fixtures
4 changes: 3 additions & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
---
repos:
- repo: https://github.com/ambv/black
rev: 21.12b0
rev: 22.3.0
hooks:
- id: black
additional_dependencies: ["click<8.1.0"]
args:
- --line-length=88
- repo: https://github.com/pycqa/isort
Expand Down
90 changes: 72 additions & 18 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ Refonte de uPont en python avec le framework django pour une meilleure accessibi

# Installation

Pour construire les images des conteneurs :
```
docker-compose build
```

Pour lancer le site en local (commandes docker-compose standard, version 1.29.2) :
```
docker-compose up -d
Expand Down Expand Up @@ -80,28 +85,77 @@ Stopper le serveur :
bash scripts/stop.sh
```

# Sauvegarde

Une sauvegarde du site consiste en une copie des données de la base données et une copie des médias (image de profil,
images liées à des posts ou des events).


## Base de données
### Réaliser une sauvegarde de la base de données

`# bash scripts/backup_database.sh`

La sauvegarde se trouve dans le dossier `backups/database` sous le nom `AnnéeMoisJourHeureMinute.dump`.

**Attention** bien vérifier que les valeurs de `DB_USER` et `DB_NAME` dans le script sont les bonnes !

### Restaurer une sauvegarde de la base de données
On commence par renter dans le container de la base de données :

`$ docker-compose exec db /bin/bash`

On restaure les données de la sauvegarde :

`# pg_restore -d $DB_NAME -U $DB_USER --clean save.dump`

**Attention** cette commande supprime le contenu actuel de la base de données pour le remplacer par celui de la
sauvegarde

## Medias
### Réaliser une sauvegarde des médias

`# bash scripts/backup_media.sh`

La sauvegarde se trouve dans le dossier `backups/media` sous le nom `AnnéeMoisJourHeureMinute.tar.gz`.

### Restaurer une sauvegarde des medias

On commence par rentrer dans le container du back :

`$ docker-compose exec bash /bin/bash`

On supprime les anciens médias :

`# rm -r /src/media/*`

On extrait la sauvegarde :

`# tar -xf save.tar.gz -C /src/media`

# Variables d'environnement

Les variables d'environnement suivantes sont placées dans le fichier *.env* :

| Variable | Description | Dev | Prod |
| -------- | -------------|----- | ------|
| DB_HOST | Nom du host de la BDD. | db | db |
| DB_PORT | Port de la BDD (interne au container). | 5432 | 5432 |
| DB_USER | Utilisateur de la BDD. | upont | upont |
| DB_NAME | Nom de la BDD. | upont | upont |
| DB_PASSWORD | Mot de passe de la BDD. | upont | SECRET |
| BACK_PORT | Port d'accès au site (externe). | 8000 | **** |
| SENDGRID_API_KEY | Clé permettant d'envoyer des mails avec l'API sendgrid (à récupérer sur le site de Sendgrid). | key | SECRET |
| ADMIN_EMAIL | Adressse recevant les mails d'administration de Django pour alertir de certaines actions (création d'un compte...). | [email protected] | Autre |
| DEFAULT_FROM_EMAIL | Adresse envoyant les mails (avec Sendigrd, n'importe quelle adresse en @enpc.org fonctionne). | [email protected] | [email protected] |
| SECRET_KEY | Clé secrète utilisée par Django. | ChangeThatPlease | SECRET |
| DEBUG | Défini si le mode DEBUG est activé. | True | False |
| GUNICORN_NB_WORKERS | Nombre de workers pour le WSGI gunicorn. | | 10 |
| SECURE_SSL_REDIRECT | Redirige automatiquement les requêtes non HTTPS vers des requêtes HTTPS. Laisser à False si un autre proxy fait déjà cete redirection. | False | False |
| REMOTE_STATIC_STORAGE | Variable indiquant si le site utilise un serveur distant pour servir les fichiers statiques. | False | True |
| FTP_STORAGE_LOCATION | URL de connexion FTP au serveur de stockage distant pour y placer les fichiers statiques. | | ftp://\<user>:\<password>@\<host>:\<port> |
| REMOTE_STATIC_URL | URL pour l'accès aux fichiers statiques distants (peut être différent de FTP_STORAGE_LOCATION). | | https://upont.cdn.enpc.org |
| Variable | Description | Dev | Prod |
|-----------------------|----------------------------------------------------------------------------------------------------------------------------------------|------------------|-------------------------------------------|
| DB_HOST | Nom du host de la BDD. | db | db |
| DB_PORT | Port de la BDD (interne au container). | 5432 | 5432 |
| DB_USER | Utilisateur de la BDD. | upont | upont |
| DB_NAME | Nom de la BDD. | upont | upont |
| DB_PASSWORD | Mot de passe de la BDD. | upont | SECRET |
| BACK_PORT | Port d'accès au site (externe). | 8000 | **** |
| SENDGRID_API_KEY | Clé permettant d'envoyer des mails avec l'API sendgrid (à récupérer sur le site de Sendgrid). | key | SECRET |
| ADMIN_EMAIL | Adressse recevant les mails d'administration de Django pour alertir de certaines actions (création d'un compte...). | [email protected] | Autre |
| DEFAULT_FROM_EMAIL | Adresse envoyant les mails (avec Sendigrd, n'importe quelle adresse en @enpc.org fonctionne). | [email protected] | [email protected] |
| SECRET_KEY | Clé secrète utilisée par Django. | ChangeThatPlease | SECRET |
| DEBUG | Défini si le mode DEBUG est activé. | True | False |
| DOMAIN_NAME | Nom de domaine utilisé en production. Toutes les requêtes ne provenant pas de ce domaine seront rejetées. | upont.enpc.org | upont.enpc.org |
| GUNICORN_NB_WORKERS | Nombre de workers pour le WSGI gunicorn. | | 10 |
| SECURE_SSL_REDIRECT | Redirige automatiquement les requêtes non HTTPS vers des requêtes HTTPS. Laisser à False si un autre proxy fait déjà cete redirection. | False | False |
| REMOTE_STATIC_STORAGE | Variable indiquant si le site utilise un serveur distant pour servir les fichiers statiques. | False | True |
| FTP_STORAGE_LOCATION | URL de connexion FTP au serveur de stockage distant pour y placer les fichiers statiques. | | ftp://\<user>:\<password>@\<host>:\<port> |
| REMOTE_STATIC_URL | URL pour l'accès aux fichiers statiques distants (peut être différent de FTP_STORAGE_LOCATION). | | https://upont.cdn.enpc.org |


Commande pour générer une clé secrète (vous devez avoir Django installé):
Expand Down
2 changes: 1 addition & 1 deletion back/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ FROM python-base as builder-base
RUN apt-get update \
&& apt-get install --no-install-recommends -y \
# deps for installing poetry
curl=7.74.0-1.3+deb11u1 \
curl=7.74.0-1.3+deb11u3 \
# deps for building python deps
build-essential=12.9 \
&& rm -rf /var/lib/apt/lists/*
Expand Down
31 changes: 27 additions & 4 deletions back/news/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,31 @@

from .models import Comment, Event, Participation, Post, Shotgun

admin.site.register(Event)
admin.site.register(Post)

class EventsAdmin(admin.ModelAdmin):
list_display = ("name", "club", "date")
list_filter = ("club",)
ordering = ("date",)


class PostsAdmin(admin.ModelAdmin):
list_display = ("title", "author", "date")
ordering = ("date", )


class ParticipationAdmin(admin.ModelAdmin):
list_display = ("participant", "shotgun", "shotgun_date")
ordering = ("shotgun_date",)


class ShotgunAdmin(admin.ModelAdmin):
list_display = ("title", "club", "starting_date", "ending_date")
list_filter = ("club",)
ordering = ("starting_date",)


admin.site.register(Event, EventsAdmin)
admin.site.register(Post, PostsAdmin)
admin.site.register(Comment)
admin.site.register(Participation)
admin.site.register(Shotgun)
admin.site.register(Participation, ParticipationAdmin)
admin.site.register(Shotgun, ShotgunAdmin)
5 changes: 0 additions & 5 deletions back/news/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@
class CommentSerializer(serializers.HyperlinkedModelSerializer):
author = StudentSerializer()
club = ClubSerializer()
comment_delete_url = serializers.SerializerMethodField()

def get_comment_delete_url(self, obj):
return reverse("news:comment_delete", args=(obj.id,))

is_my_comment = serializers.SerializerMethodField()

Expand All @@ -36,7 +32,6 @@ class Meta:
"club",
"date",
"content",
"comment_delete_url",
"is_my_comment",
"id",
]
Expand Down
8 changes: 4 additions & 4 deletions back/news/templates/news/event_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<!--Main Content-->
<div class="content-main">

<h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un event</h3>
<h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un évènement</h3>

<!--News Card-->
<div class="news-card">
Expand All @@ -32,7 +32,7 @@ <h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un event<
{{EditEvent.description.errors}}
<div class="input-title">Description de l'évènement :</div>
{{EditEvent.description}}
<p>Tu peux écrire en markdown, rends toi <a href="{% url 'news:markdown' %}">ici</a> pour en savoir plus.</p>
<p>Tu peux écrire en markdown, rends toi <a href="{% url 'news:markdown' %}" target="_blank">ici</a> pour en savoir plus.</p>

{{EditEvent.date.errors}}
<div class="input-title">Date de l'évènement :</div>
Expand Down Expand Up @@ -62,7 +62,7 @@ <h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un event<
{{EditEvent.shotgun}}
</div>
</div>
{%if event.poster%}
{% if event.poster %}
<div class="news-card-images">
<!--All-Images-Linked-With-The-Event-->
<div class="news-card-carousel">
Expand All @@ -71,7 +71,7 @@ <h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un event<
</div>
</div>
</div>
{%endif%}
{% endif %}
<div class="centered-div">
<a href="{% if event %}{% url 'news:event_detail' event.id %}{% else %}{% url 'news:events' %}{% endif %}"><button type="button" class="button red-button">Annuler</button></a>
<button class="button green-button" type="submit" name="Valider">Valider</button>
Expand Down
10 changes: 7 additions & 3 deletions back/news/templates/news/events.html
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<!--Content-->
<div class="content">

<!--Header Content-->
<!--Header Content
<div class="content-header">
<div class="row justify-content-between w-100">
<div class="col">
Expand All @@ -24,6 +24,7 @@
</div>
</div>
</div>
-->

<!--Main Content-->
<div class="content-main">
Expand All @@ -34,10 +35,13 @@ <h3 class="page-title">Évènements</h3>
{% include "../news/newsnav.html" %}
<!--End of News Navigation-->

{% if is_member %}
<div class="centered-div mt-2">
<h5 class="text-bold mb-2">Ajouter un évènement</h5>
<a href="{% url 'news:event_create' %}"><i class="fas fa-plus-circle fa-5x"></i></a>
<a href="{% url 'news:event_create' %}">
<button class="button blue-button "><i class="fas fa-plus-circle fa-2x logo-button"></i>Ajouter un évènement</button>
</a>
</div>
{% endif %}

{% for event in all_events_list %}
<!--News Card-->
Expand Down
8 changes: 5 additions & 3 deletions back/news/templates/news/post_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,10 @@ <h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un post</
<div class="news-card-content">
<div class="centered-div">
{{EditPost.club.errors}}
<div class="input-title">Publier en tant que :</div>
{{EditPost.club}}
{% if EditPost.club|length > 1 %}
<div class="input-title">Publier en tant que :</div>
{{EditPost.club}}
{% endif %}

{{EditPost.event.errors}}
<div class="input-title">Est-ce que ce post est associé à un évènement ?</div>
Expand All @@ -39,7 +41,7 @@ <h3 class="page-title">{% if Edit %}Éditer{% else %}Créer{% endif %} un post</
{{EditPost.content.errors}}
<div class="input-title">Description :</div>
{{EditPost.content}}<br>
<p>Tu peux écrire en markdown, rends toi <a href="{% url 'news:markdown' %}">ici</a> pour en savoir plus.</p>
<p>Tu peux écrire en markdown, rends toi <a href="{% url 'news:markdown' %}" target="_blank">ici</a> pour en savoir plus.</p>

{{EditPost.illustration.errors}}
<div class="input-title">Ajouter/modifier une image :</div>
Expand Down
9 changes: 6 additions & 3 deletions back/news/templates/news/posts.html
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<!--Content-->
<div class="content">

<!--Header Content-->
<!--Header Content
<div class="content-header">
<div class="row justify-content-between w-100">
<div class="col">
Expand All @@ -26,6 +26,7 @@
</div>
</div>
</div>
-->

<!--Main Content-->
<div class="content-main">
Expand All @@ -37,8 +38,9 @@ <h3 class="page-title">Posts</h3>
<!--End of News Navigation-->

<div class="centered-div mt-2">
<h5 class="text-bold mb-2">Ajouter un post</h5>
<a href="{% url 'news:post_create' %}"><i class="fas fa-plus-circle fa-5x"></i></a>
<a href="{% url 'news:post_create' %}">
<button class="button blue-button "><i class="fas fa-plus-circle fa-2x logo-button"></i>Ajouter un post</button>
</a>
</div>

<!--News Card-->
Expand All @@ -52,6 +54,7 @@ <h5 class="text-bold mb-2">Ajouter un post</h5>
</div><!--End of Content-->

<!--Scripts-->
<script src="{% url 'reverse_js' %}" type="text/javascript"></script> <!--Put this script before any react script to be able to reverse django urls in react-->
<script>
window.react_mount = document.getElementById('posts');
</script>
Expand Down
Loading

0 comments on commit 557fc79

Please sign in to comment.