Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
7dbb8aa
Refactor project into modular apps (oc_lettings_site, lettings, profi…
Imed7223 Jan 11, 2026
bc5d739
flake8 et test et corrections
Imed7223 Jan 12, 2026
2425359
admin et quelques correctios lettings/models.py
Imed7223 Jan 12, 2026
0071b04
corrections erreurs
Imed7223 Jan 13, 2026
2f87b9c
encore corrections erreurs
Imed7223 Jan 13, 2026
01ac883
corrections sentry_debug
Imed7223 Jan 15, 2026
68a83a0
logging + sentry_debug
Imed7223 Jan 15, 2026
401c8a5
docString
Imed7223 Jan 15, 2026
bad54fd
404.html and 500.html
Imed7223 Jan 16, 2026
290ef62
logging
Imed7223 Jan 16, 2026
c7999a5
Add GitHub Actions CI/CD pipeline
Imed7223 Jan 16, 2026
e559c76
Configure CI/CD pipeline with Docker and Sentry
Imed7223 Jan 16, 2026
34f77ff
Add six dependency for pytest-django
Imed7223 Jan 16, 2026
fedb5f4
delete notify discord from ci-cd.yml
Imed7223 Jan 16, 2026
fd369b9
Dokerfile+dikerignore
Imed7223 Jan 16, 2026
628144f
Add Docker configuration and WhiteNoise for static files
Imed7223 Jan 17, 2026
f89d10b
modification settings
Imed7223 Jan 17, 2026
480df70
Fix staticfiles, Docker, .gitignore
Jan 18, 2026
3dae561
django 6,admin
Jan 18, 2026
109a175
github/workflows/ci-cd.yml
Jan 18, 2026
7153b44
config readthedocs
Jan 19, 2026
1fffa86
ci-cd.yml
Jan 22, 2026
e3fd512
correction ci-cd.yml
Jan 22, 2026
4d0168a
Fix lettings tests: dicts() → values() for Python 3.14
Jan 22, 2026
4503571
Fix index tests: dicts() → values() Python 3.14
Jan 22, 2026
df1a888
Fix profiles tests: dicts() → values() Python 3.14
Jan 22, 2026
e9973d3
Fix: Resolve version incompatibilities and pass all integration tests
Jan 22, 2026
f3aabc7
Fix: Resolve flake8
Jan 22, 2026
e3d7c3a
fix: ci/cd.yml
Jan 22, 2026
a7a005e
modify docker.compose.yml
Jan 22, 2026
1d95d17
commit
Jan 22, 2026
9f7d895
ALLOWED8HOSTS
Jan 23, 2026
1801d2d
.readthedocs.yaml
Jan 23, 2026
65b3cff
Radme.md
Jan 23, 2026
5466c9b
.readthedocs
Jan 24, 2026
4cfcbc2
.gitignore
Jan 24, 2026
0c7b9cd
conf.py correction du chemain
Jan 24, 2026
c054e7a
start project
Jan 24, 2026
69dfdcd
Âmodify docker-compose.yml
Jan 24, 2026
3c1b687
rajoute tes_db.sqlite3 au dockerfile
Jan 28, 2026
196a15a
correction du fichier ci-cd.yml
Jan 28, 2026
27cdec0
Add Render domain to ALLOWED_HOSTS
Jan 28, 2026
4e1e452
Add Render domain to ALLOWED_HOSTS
Jan 28, 2026
f4cb915
new change commit
Imed7223 Mar 29, 2026
867cb03
tests commit
Imed7223 Mar 29, 2026
c5f0f14
last commit
Imed7223 Mar 30, 2026
49e0033
cd-ci
Imed7223 Mar 30, 2026
42d36eb
cd-ci new
Imed7223 Mar 30, 2026
3ca5db6
cd-ci modifie
Imed7223 Mar 30, 2026
e15f8b5
nodje24
Imed7223 Mar 30, 2026
84d8447
sqlite3
Imed7223 Mar 30, 2026
e8ba030
.gitignore
Imed7223 Mar 30, 2026
c7a698d
flake8
Imed7223 Mar 30, 2026
5e187d1
allowed hosts
Imed7223 Mar 30, 2026
351b863
cloudary
Imed7223 Mar 30, 2026
39e9b12
admin
Imed7223 Mar 30, 2026
6c921e3
admin2
Imed7223 Mar 30, 2026
9e71491
admin3
Imed7223 Mar 30, 2026
c30eec1
Fix Django conflict and set python runtime to 3.11
Imed7223 Mar 30, 2026
38f9c63
css mobile
Imed7223 Mar 30, 2026
33694f9
responsive
Imed7223 Mar 30, 2026
9eb46e3
responsive2
Imed7223 Mar 30, 2026
1bb22cf
railway
Imed7223 Mar 31, 2026
ba6ec8d
railway21
Imed7223 Mar 31, 2026
96a9e59
css
Imed7223 Mar 31, 2026
8fca039
staticfiles
Imed7223 Mar 31, 2026
37d4ec4
staticfiles
Imed7223 Mar 31, 2026
ceecb75
static
Imed7223 Mar 31, 2026
62413a3
settings
Imed7223 Mar 31, 2026
e256816
img
Imed7223 Mar 31, 2026
dc0fac1
procfile
Imed7223 Mar 31, 2026
e7a9bb1
img
Imed7223 Mar 31, 2026
242b3dc
background
Imed7223 Mar 31, 2026
fd558c0
storage
Imed7223 Mar 31, 2026
465961e
docker-compose
Imed7223 Mar 31, 2026
f542cd6
settings
Imed7223 Mar 31, 2026
5fc5e4c
dockerfile
Imed7223 Mar 31, 2026
a2cbcad
image
Imed7223 Mar 31, 2026
e9e9c15
lettings
Imed7223 Mar 31, 2026
12f7229
dockerfile
Imed7223 Mar 31, 2026
ed3c927
docker
Imed7223 Mar 31, 2026
75927cb
docker
Imed7223 Mar 31, 2026
14e4fa5
settings
Imed7223 Mar 31, 2026
9930c29
docker
Imed7223 Mar 31, 2026
777c984
staticfiles
Imed7223 Mar 31, 2026
b33dfa9
settings
Imed7223 Mar 31, 2026
d0a0dfb
admin
Imed7223 Mar 31, 2026
ae72bc5
admin
Imed7223 Mar 31, 2026
dab65bd
css
Imed7223 Mar 31, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
Binary file added .coverage
Binary file not shown.
8 changes: 8 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
env/
venv/
__pycache__/
*.pyc
.git/
.github/
.env
.venv/
10 changes: 10 additions & 0 deletions .flake8
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[flake8]
exclude =
.venv,
venv,
.venv/
venv\Scripts\pywin32_postinstall.py
__pycache__,
build,
dist
max-line-length = 88
74 changes: 74 additions & 0 deletions .github/workflows/ci-cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
name: CI/CD - OC Lettings Django

on:
push:
branches: [ feature/modular-architecture ]
pull_request:
branches: [ feature/modular-architecture ]

env:
PYTHON_VERSION: '3.11'
DJANGO_SETTINGS_MODULE: 'oc_lettings_site.settings'
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
lint-test:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: ${{ env.PYTHON_VERSION }}

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest pytest-django pytest-cov flake8

- name: Lint with flake8
run: flake8 .

- name: Apply migrations
run: python manage.py migrate --noinput

- name: Run tests
env:
SECRET_KEY: "test-secret-key"
SENTRY_DSN: ""
run: |
pytest --cov=oc_lettings_site --cov=lettings --cov=profiles \
--cov-report=term-missing

docker-build:
needs: lint-test
runs-on: ubuntu-latest
if: github.event_name == 'push'

steps:
- name: Checkout repository
uses: actions/checkout@v4

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}

- name: Build and push Docker image
uses: docker/build-push-action@v6
with:
context: .
push: true
tags: |
${{ secrets.DOCKERHUB_USERNAME }}/oc-lettings:latest
${{ secrets.DOCKERHUB_USERNAME }}/oc-lettings:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
**/__pycache__
*.pyc
env
.env
.media
env/
venv/
*.venv/
*.idea
*.coverage
venv
*.venv
*.idea/
5 changes: 5 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions .idea/Python-OC-Lettings-FR.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/encodings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .readthedocs.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
version: 2

build:
os: ubuntu-22.04
tools:
python: "3.12"

python:
install:
- requirements: requirements.txt

sphinx:
configuration: doc/source/conf.py
20 changes: 20 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
FROM python:3.11-slim

ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
DJANGO_SETTINGS_MODULE=oc_lettings_site.settings \
SECRET_KEY=build-secret-key-not-for-production

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -r requirements.txt

COPY . .

COPY test_db.sqlite3 /app/test_db.sqlite3

EXPOSE 8000

CMD ["sh", "-c", "echo '=== contenu /app/static ===' && ls /app/static/ && python manage.py collectstatic --noinput && gunicorn oc_lettings_site.wsgi:application --bind 0.0.0.0:8000"]
2 changes: 2 additions & 0 deletions Procfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
web: gunicorn oc_lettings_site.wsgi
release: python manage.py collectstatic --noinput
74 changes: 49 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,45 +1,52 @@
## Résumé

Site web d'Orange County Lettings
Site web d'Orange County Lettings (projet Django modulaires : applications `home`, `lettings`, `profiles`).

## Développement local

### Prérequis

- Compte GitHub avec accès en lecture à ce repository
- Git CLI
- SQLite3 CLI
- Interpréteur Python, version 3.6 ou supérieure
- Compte GitHub avec accès en lecture à ce repository.
- Git CLI.
- SQLite3 CLI.
- Interpréteur Python, version 3.11 ou supérieure.
- (Optionnel) Docker Desktop si vous souhaitez utiliser l’exécution via conteneur.

Dans le reste de la documentation sur le développement local, il est supposé que la commande `python` de votre OS shell exécute l'interpréteur Python ci-dessus (à moins qu'un environnement virtuel ne soit activé).
Dans le reste de la documentation sur le développement local sans Docker,
il est supposé que la commande `python` de votre OS shell exécute l'interpréteur
Python ci-dessus (à moins qu'un environnement virtuel ne soit activé).

### macOS / Linux
### macOS / Linux (sans Docker)

#### Cloner le repository

- `cd /path/to/put/project/in`
- `git clone https://github.com/OpenClassrooms-Student-Center/Python-OC-Lettings-FR.git`
- `git clone <URL DE VOTRE FORK>`
- `cd Python-OC-Lettings-FR`

#### Créer l'environnement virtuel

- `cd /path/to/Python-OC-Lettings-FR`
- `python -m venv venv`
- `apt-get install python3-venv` (Si l'étape précédente comporte des erreurs avec un paquet non trouvé sur Ubuntu)
- Activer l'environnement `source venv/bin/activate`
- Confirmer que la commande `python` exécute l'interpréteur Python dans l'environnement virtuel
`which python`
- Confirmer que la version de l'interpréteur Python est la version 3.6 ou supérieure `python --version`
- Confirmer que la commande `pip` exécute l'exécutable pip dans l'environnement virtuel, `which pip`
- Pour désactiver l'environnement, `deactivate`
- `apt-get install python3-venv` (si l'étape précédente échoue avec un paquet non trouvé sur Ubuntu)
- Activer l'environnement : `source venv/bin/activate`
- Confirmer que la commande `python` exécute l'interpréteur Python dans l'environnement virtuel :
`which python`
- Confirmer que la version de l'interpréteur Python est la version 3.11 ou supérieure :
`python --version`
- Confirmer que la commande `pip` exécute l'exécutable pip dans l'environnement virtuel :
`which pip`
- Pour désactiver l'environnement : `deactivate`

#### Exécuter le site

- `cd /path/to/Python-OC-Lettings-FR`
- `source venv/bin/activate`
- `pip install --requirement requirements.txt`
- `python manage.py migrate`
- `python manage.py runserver`
- Aller sur `http://localhost:8000` dans un navigateur.
- Confirmer que le site fonctionne et qu'il est possible de naviguer (vous devriez voir plusieurs profils et locations).
- Confirmer que le site fonctionne et qu'il est possible de naviguer
(vous devriez voir plusieurs profils et locations via les applications`lettings` et `profiles`).

#### Linting

Expand All @@ -57,21 +64,38 @@ Dans le reste de la documentation sur le développement local, il est supposé q

- `cd /path/to/Python-OC-Lettings-FR`
- Ouvrir une session shell `sqlite3`
- Se connecter à la base de données `.open oc-lettings-site.sqlite3`
- Afficher les tables dans la base de données `.tables`
- Afficher les colonnes dans le tableau des profils, `pragma table_info(Python-OC-Lettings-FR_profile);`
- Lancer une requête sur la table des profils, `select user_id, favorite_city from
Python-OC-Lettings-FR_profile where favorite_city like 'B%';`
- Se connecter à la base de données :
`.open test_db.sqlite3`
- Afficher les tables dans la base de données :
`.tables`
- Afficher les colonnes dans la table des profils :
`pragma table_info(oc_lettings_site_profile);` *(adapter au nom réel de la table si différent)*
- Lancer une requête sur la table des profils, par exemple :
`select user_id, favorite_city from oc_lettings_site_profile where favorite_city like 'B%';`
- `.quit` pour quitter

#### Panel d'administration

- Aller sur `http://localhost:8000/admin`
- Connectez-vous avec l'utilisateur `admin`, mot de passe `Abc1234!`
- Connectez-vous avec l'utilisateur `user`, mot de passe `Abc1234!` (ou les identifiants définis dans vos fixtures / données locales).

### Exécution avec Docker (optionnel)

Si vous utilisez Docker :

- Construire l’image :
`docker build -t oc-lettings:local .`
- Lancer le conteneur :
`docker run -p 8000:8000 -e SECRET_KEY="test_key" -e DEBUG=False oc-lettings:local`
- Aller sur `http://localhost:8000` dans un navigateur.

*(Adapter cette section si vous utilisez `docker-compose` et un volume pour la base SQLite.)*

### Windows

Utilisation de PowerShell, comme ci-dessus sauf :

- Pour activer l'environnement virtuel, `.\venv\Scripts\Activate.ps1`
- Remplacer `which <my-command>` par `(Get-Command <my-command>).Path`
- Pour activer l'environnement virtuel :
`.\venv\Scripts\Activate.ps1`
- Remplacer `which <my-command>` par :
`(Get-Command <my-command>).Path`
Empty file added accounts/__init__.py
Empty file.
Empty file added accounts/admin.py
Empty file.
6 changes: 6 additions & 0 deletions accounts/apps.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
from django.apps import AppConfig


class AccountsConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'accounts'
15 changes: 15 additions & 0 deletions accounts/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from django import forms
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
from django.contrib.auth.models import User


class SignupForm(UserCreationForm):
email = forms.EmailField(required=True)

class Meta:
model = User
fields = ("username", "email", "password1", "password2")


class LoginForm(AuthenticationForm):
pass
Empty file added accounts/migrations/__init__.py
Empty file.
Empty file added accounts/models.py
Empty file.
28 changes: 28 additions & 0 deletions accounts/templates/accounts/login.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{% extends "base.html" %}
{% block title %}Connexion{% endblock %}

{% block content %}
<div class="container px-5 py-5">
<div class="row justify-content-center">
<div class="col-lg-5">
<h1 class="display-6 mb-4">Connexion</h1>
<form method="post">
{% csrf_token %}
{% for field in form %}
<div class="mb-3">
<label class="form-label">{{ field.label }}</label>
{{ field }}
{% if field.errors %}
<div class="text-danger small mt-1">{{ field.errors.0 }}</div>
{% endif %}
</div>
{% endfor %}
<button type="submit" class="btn btn-primary w-100">Se connecter</button>
</form>
<p class="mt-3 text-center">
Pas encore de compte ? <a href="{% url 'accounts:signup' %}">Inscription</a>
</p>
</div>
</div>
</div>
{% endblock %}
Loading