diff --git a/.env.example b/.env.example index 145b31e..930af5b 100644 --- a/.env.example +++ b/.env.example @@ -14,3 +14,42 @@ ADMINS=admin:photos-admin@lists.crans.org # Email address used as sender for server emails SERVER_EMAIL=photos@crans.org + +# Email verification: 'mandatory', 'optional', or 'none' +EMAIL_VERIFICATION=mandatory + +# Mail server settings +SMTP_HOST=localhost +SMTP_PORT=25 +#SMTP_USER= +#SMTP_PASSWORD= +SMTP_USE_TLS=False + +# OAuth2 settings +# Enable OAuth2 login +OAUTH_ENABLED=False +# Disable normal username/password login (requires OAUTH_ENABLED=True) +OAUTH_ONLY=False +# OAuth2 server base URL (e.g. auth.example.com) +#OAUTH_SERVER_URL= +# OAuth2 app credentials +#OAUTH_CLIENT_ID= +#OAUTH_CLIENT_SECRET= +# Button appearance on the login page +#OAUTH_BUTTON_TEXT=Login with OAuth +#OAUTH_BUTTON_IMAGE= +# Space-separated OAuth2 scopes +#OAUTH_SCOPE=openid profile email + +# Database engine: 'sqlite' or 'postgres' +DB_ENGINE=sqlite + +# PostgreSQL settings (only used when DB_ENGINE=postgres) +#DB_NAME=photo21 +#DB_USER=photo21 +#DB_PASSWORD= +#DB_HOST=localhost +#DB_PORT=5432 + +# SQLite settings (only used when DB_ENGINE=sqlite) +#DB_PATH=/app/data/db.sqlite3 diff --git a/.forgejo/workflows/docker.yml b/.forgejo/workflows/docker.yml new file mode 100644 index 0000000..e5da6fc --- /dev/null +++ b/.forgejo/workflows/docker.yml @@ -0,0 +1,33 @@ +name: Docker + +on: + release: + types: + - published + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Set image tag + id: meta + run: echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT + + - name: Login to Forgejo registry + uses: docker/login-action@v3 + with: + registry: git.sinfonie.org + username: ${{ secrets.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Build and push image + run: | + docker build \ + -t git.sinfonie.org/sinfonie/photo26:${{ steps.meta.outputs.TAG }} \ + -t git.sinfonie.org/sinfonie/photo26:latest \ + . + docker push git.sinfonie.org/sinfonie/photo26:${{ steps.meta.outputs.TAG }} + docker push git.sinfonie.org/sinfonie/photo26:latest + diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..8e47172 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +RUN apt-get update && apt-get install -y gettext && rm -rf /var/lib/apt/lists/* + +COPY . . + +RUN SECRET_KEY=dummy python manage.py compilemessages + +# Create volume mount points +RUN mkdir -p /app/media /app/static /app/data + +EXPOSE 8000 + +RUN chmod +x entrypoint.sh +ENTRYPOINT ["./entrypoint.sh"] diff --git a/README.md b/README.md index d8e6581..af3ec10 100644 --- a/README.md +++ b/README.md @@ -1,64 +1,121 @@ -# Photo server 2021-2023 +# Photo server [![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0.txt) This is the source code for the webserver hosting pictures from the -ENS Paris-Saclay student life. +ENS Rennes student life. The philosophy of this project is to keep this code as simple as possible to run and to maintain. -## Setup +This project is a fork of [Photo21](https://gitlab.crans.org/bde/photo21/), +originally developed at ENS Paris-Saclay. -1. **Dependency installation.** +## Docker install (recommended for production) + +1. Create a `docker-compose.yml` (a ready-to-use file is provided in the repository): + + ```yaml + version: "3.9" + + networks: + photo26: + + services: + db: + image: postgres:16 + container_name: photo26-db + restart: unless-stopped + environment: + POSTGRES_DB: photo26 + POSTGRES_USER: photo26 + POSTGRES_PASSWORD: change-me + volumes: + - ./postgres_data:/var/lib/postgresql/data + networks: + - photo26 + + photo26: + image: git.sinfonie.org/sinfonie/photo26:latest + container_name: photo26-app + restart: unless-stopped + depends_on: + - db + environment: + DB_ENGINE: postgres + DB_NAME: photo26 + DB_USER: photo26 + DB_PASSWORD: change-me + DB_HOST: db + DB_PORT: 5432 + SECRET_KEY: change-me + EXTRA_HOSTS: photos.example.org + volumes: + - ./media:/app/media + ports: + - "8080:8000" + networks: + - photo26 + ``` + +2. Start the stack: + + ```bash + docker compose up -d + ``` + + On first start the container will run migrations and create a default admin account automatically. + +3. **Default credentials** — change these immediately after first login: + + | Field | Value | + |----------|-----------------| + | Username | `admin` | + | Password | `admin` | + | Email | `admin@localhost` | + + Admin panel: `http://localhost:8080/admin/` + +4. **Passwords to change** in `docker-compose.yml` before going to production: + - `POSTGRES_PASSWORD` / `DB_PASSWORD` — database password + - `SECRET_KEY` — Django secret key (use a long random string) + - Log in to the admin panel and change the `admin` user password + +## Development setup + +1. **Cloning.** + Change directory to where you want the project to be. + + ```bash + git clone https://codeberg.org/krek0/photo21.git && cd photo21 + ``` + +2. **Dependency installation.** If you are not using Debian, please feel free to adapt the following instructions. ```bash sudo apt install git gettext python3-django python3-django-allauth python3-django-crispy-forms python3-docutils python3-exifread python3-pil - - # Only for production - sudo apt install nginx uwsgi uwsgi-plugin-python3 python3-certbot-nginx ``` -2. **Cloning.** - Change directory to where you want the project to be. - In production, we usually use `/var/www/photos/` as the `root` user. +3. **Configuration.** ```bash - git clone https://gitlab.crans.org/bde/photo21.git && cd photo21 - ``` - -3. **Configuration (production only).** - - ```bash - # Only for production sudo mkdir static media - sudo cp docs/maintenance.html static/maintenance.html - sudo chown www-data:www-data -R static media - sudo chmod g+rwx -R static media sudo chmod +x maintenance_tool.sh - sudo cp docs/uwsgi_photos.ini /etc/uwsgi/apps-available/uwsgi_photos.ini - sudo ln -s /etc/uwsgi/apps-available/uwsgi_photos.ini /etc/uwsgi/apps-enabled/ - sudo cp docs/nginx_photos_maintenance /etc/nginx/sites-available/photos.crans.org - sudo ln -s /etc/nginx/sites-available/photos.crans.org /etc/nginx/sites-enabled/ - sudo cp docs/letsencrypt_photos.crans.org /etc/letsencrypt/conf.d/photos.crans.org - sudo cp docs/renewal-hooks_post_nginx /etc/letsencrypt/renewal-hooks/post/nginx - sudo certbot --config /etc/letsencrypt/conf.d/photos.crans.org.ini certonly ``` -4. **Database (production only).** +4. **Database.** In development, you may use SQLite (no setup). In production, we use PostgreSQL which require a bit of setup: ```bash sudo apt install postgresql postgresql-contrib sudo -u postgres psql - postgres=# CREATE USER photo21 WITH PASSWORD 'un_mot_de_passe_sur'; + postgres=# CREATE USER photo21 WITH PASSWORD 'your_password'; postgres=# CREATE DATABASE photo21 OWNER photo21; ``` -5. **Initialization.**, - In production, please use `www-data` user. +5. **Initialization.** ``` ./manage.py collectstatic @@ -69,19 +126,14 @@ run and to maintain. # Only when creating a new database ./manage.py loaddata initial ./manage.py createsuperuser - # change DEBUG to True in photo21/settings.py ``` -6. **Maintenance Mode.**, - In production to toggle the server mainteance mode +6. **Maintenance Mode.** + In production to toggle the server maintenance mode ```./maintenance_tool.sh``` - -6. *Enjoy \o/* - - In production, the NGINX site should now work. - In development, you can launch the development server using: +7. *Enjoy \o/* ```bash (env)$ ./manage.py runserver diff --git a/allauth_note_kfet/__init__.py b/allauth_oauth/__init__.py similarity index 69% rename from allauth_note_kfet/__init__.py rename to allauth_oauth/__init__.py index 6c9e378..eae4948 100644 --- a/allauth_note_kfet/__init__.py +++ b/allauth_oauth/__init__.py @@ -1,3 +1,5 @@ # This file is part of photo21 # Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later + +default_app_config = "allauth_oauth.apps.AllauthOAuthConfig" diff --git a/allauth_note_kfet/provider.py b/allauth_oauth/provider.py similarity index 83% rename from allauth_note_kfet/provider.py rename to allauth_oauth/provider.py index d2ce6a5..6a6430c 100644 --- a/allauth_note_kfet/provider.py +++ b/allauth_oauth/provider.py @@ -7,15 +7,15 @@ from allauth.socialaccount.providers.base import ProviderAccount from allauth.socialaccount.providers.oauth2.provider import OAuth2Provider -class NoteKfetAccount(ProviderAccount): +class OAuthAccount(ProviderAccount): def to_str(self): return self.account.extra_data.get("username") -class NoteKfetProvider(OAuth2Provider): - id = "notekfet" - name = "Note Kfet" - account_class = NoteKfetAccount +class OAuthProvider(OAuth2Provider): + id = "oauth" + name = "OAuth" + account_class = OAuthAccount def extract_uid(self, data): return str(data["username"]) @@ -39,4 +39,4 @@ class NoteKfetProvider(OAuth2Provider): return ret -provider_classes = [NoteKfetProvider] +provider_classes = [OAuthProvider] diff --git a/allauth_note_kfet/urls.py b/allauth_oauth/urls.py similarity index 70% rename from allauth_note_kfet/urls.py rename to allauth_oauth/urls.py index e1bf561..190eac3 100644 --- a/allauth_note_kfet/urls.py +++ b/allauth_oauth/urls.py @@ -4,6 +4,6 @@ from allauth.socialaccount.providers.oauth2.urls import default_urlpatterns -from .provider import NoteKfetProvider +from .provider import OAuthProvider -urlpatterns = default_urlpatterns(NoteKfetProvider) +urlpatterns = default_urlpatterns(OAuthProvider) diff --git a/allauth_note_kfet/views.py b/allauth_oauth/views.py similarity index 77% rename from allauth_note_kfet/views.py rename to allauth_oauth/views.py index 86a16ee..7a568a5 100644 --- a/allauth_note_kfet/views.py +++ b/allauth_oauth/views.py @@ -10,11 +10,11 @@ from allauth.socialaccount.providers.oauth2.views import ( OAuth2LoginView, ) -from .provider import NoteKfetProvider +from .provider import OAuthProvider -class NoteKfetOAuth2Adapter(OAuth2Adapter): - provider_id = NoteKfetProvider.id +class OAuthAdapter(OAuth2Adapter): + provider_id = OAuthProvider.id def complete_login(self, request, app, token, **kwargs): headers = { @@ -31,7 +31,7 @@ class NoteKfetOAuth2Adapter(OAuth2Adapter): @property def domain(self): - return self.settings.get("DOMAIN", "note.crans.org") + return self.settings.get("DOMAIN", "") @property def access_token_url(self): @@ -46,5 +46,5 @@ class NoteKfetOAuth2Adapter(OAuth2Adapter): return f"https://{self.domain}/api/me/" -oauth2_login = OAuth2LoginView.adapter_view(NoteKfetOAuth2Adapter) -oauth2_callback = OAuth2CallbackView.adapter_view(NoteKfetOAuth2Adapter) +oauth2_login = OAuth2LoginView.adapter_view(OAuthAdapter) +oauth2_callback = OAuth2CallbackView.adapter_view(OAuthAdapter) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..001fed7 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,40 @@ +version: "3.9" + +networks: + photo26: + +services: + db: + image: postgres:16 + container_name: photo26-db + restart: unless-stopped + environment: + POSTGRES_DB: photo26 + POSTGRES_USER: photo26 + POSTGRES_PASSWORD: change-me + volumes: + - ./postgres_data:/var/lib/postgresql/data + networks: + - photo26 + + photo26: + image: git.sinfonie.org/sinfonie/photo26:latest + container_name: photo26-app + restart: unless-stopped + depends_on: + - db + environment: + DB_ENGINE: postgres + DB_NAME: photo26 + DB_USER: photo26 + DB_PASSWORD: change-me + DB_HOST: db + DB_PORT: 5432 + SECRET_KEY: change-me + EXTRA_HOSTS: photos.example.org + volumes: + - ./media:/app/media + ports: + - "8080:8000" + networks: + - photo26 diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100644 index 0000000..8638676 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +python manage.py collectstatic --noinput +python manage.py migrate --noinput +python manage.py loaddata initial +python manage.py create_default_admin +exec gunicorn photo21.wsgi:application --bind 0.0.0.0:8000 --workers 3 diff --git a/photo21/fixtures/initial.json b/photo21/fixtures/initial.json index f4fd3e8..640ac69 100644 --- a/photo21/fixtures/initial.json +++ b/photo21/fixtures/initial.json @@ -30,7 +30,7 @@ "height": 180, "quality": 70, "upscale": false, - "crop": true, + "crop": false, "pre_cache": true, "increment_count": false } diff --git a/photo21/forms.py b/photo21/forms.py index 7c15e1e..253fab3 100644 --- a/photo21/forms.py +++ b/photo21/forms.py @@ -13,8 +13,7 @@ class CustomSignupForm(SignupForm): # Add description on email field self.fields["email"].help_text = _( - "Please enter a valid email address ending with `@crans.org` or " - "`@ens-paris-saclay.fr`." + "Please enter a valid email address ending with `@ens-rennes.fr`" ) def clean_email(self): @@ -22,10 +21,8 @@ class CustomSignupForm(SignupForm): Check that the email address ends with a trusted domain. """ email = super().clean_email() - if not email.endswith("@crans.org") and not email.endswith( - "@ens-paris-saclay.fr" - ): + if not email.endswith("@ens-rennes.fr"): raise forms.ValidationError( - _("Must end with `@crans.org` or `@ens-paris-saclay.fr`.") + _("Must end with `@ens-rennes.fr`.") ) return email diff --git a/photo21/locale/de/LC_MESSAGES/django.po b/photo21/locale/de/LC_MESSAGES/django.po deleted file mode 100644 index b1514bd..0000000 --- a/photo21/locale/de/LC_MESSAGES/django.po +++ /dev/null @@ -1,321 +0,0 @@ -# This file is part of photo21 -# Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay -# SPDX-License-Identifier: GPL-3.0-or-later -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-07 20:03+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" - -#: .\photo21\forms.py:16 -msgid "" -"Please enter a valid email address ending with `@crans.org` or `@ens-paris-" -"saclay.fr`." -msgstr "" - -#: .\photo21\forms.py:29 -msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`." -msgstr "" - -#: .\photo21\settings.py:171 -msgid "German" -msgstr "" - -#: .\photo21\settings.py:172 -msgid "English" -msgstr "" - -#: .\photo21\settings.py:173 -msgid "Spanish" -msgstr "" - -#: .\photo21\settings.py:174 -msgid "French" -msgstr "" - -#: .\photo21\templates\400.html:12 -msgid "Bad request" -msgstr "" - -#: .\photo21\templates\400.html:16 -msgid "" -"Sorry, your request was bad. Don't know what could be wrong. An email has " -"been sent to webmasters with the details of the error. You can now drink a " -"coke." -msgstr "" - -#: .\photo21\templates\403.html:12 -msgid "Permission denied" -msgstr "" - -#: .\photo21\templates\403.html:15 -msgid "You don't have the right to perform this request." -msgstr "" - -#: .\photo21\templates\403.html:17 .\photo21\templates\404.html:21 -msgid "Exception message:" -msgstr "" - -#: .\photo21\templates\404.html:12 -msgid "Page not found" -msgstr "" - -#: .\photo21\templates\404.html:16 -#, python-format -msgid "" -"The requested path %(request_path)s was not found on the server." -msgstr "" - -#: .\photo21\templates\500.html:12 -msgid "Server error" -msgstr "" - -#: .\photo21\templates\500.html:16 -msgid "" -"Sorry, an error occurred when processing your request. An email has been " -"sent to webmasters with the detail of the error, and this will be fixed " -"soon. You can go drink a soft." -msgstr "" - -#: .\photo21\templates\account\email.html:8 -#: .\photo21\templates\account\email.html:16 -#: .\photo21\templates\socialaccount\connections.html:16 -msgid "E-mail Addresses" -msgstr "" - -#: .\photo21\templates\account\email.html:11 .\photo21\templates\base.html:63 -#: .\photo21\templates\socialaccount\connections.html:11 -msgid "Account" -msgstr "" - -#: .\photo21\templates\account\email.html:19 -#: .\photo21\templates\socialaccount\connections.html:19 -msgid "Social connections" -msgstr "" - -#: .\photo21\templates\account\email.html:25 -msgid "The following e-mail addresses are associated with your account:" -msgstr "" - -#: .\photo21\templates\account\email.html:36 -msgid "Verified" -msgstr "" - -#: .\photo21\templates\account\email.html:38 -msgid "Unverified" -msgstr "" - -#: .\photo21\templates\account\email.html:40 -msgid "Primary" -msgstr "" - -#: .\photo21\templates\account\email.html:46 -msgid "Make Primary" -msgstr "" - -#: .\photo21\templates\account\email.html:47 -msgid "Re-send Verification" -msgstr "" - -#: .\photo21\templates\account\email.html:48 -#: .\photo21\templates\socialaccount\connections.html:47 -msgid "Remove" -msgstr "" - -#: .\photo21\templates\account\email.html:53 -msgid "Warning:" -msgstr "" - -#: .\photo21\templates\account\email.html:53 -msgid "" -"You currently do not have any e-mail address set up. You should really add " -"an e-mail address so you can receive notifications, reset your password, etc." -msgstr "" - -#: .\photo21\templates\account\email.html:57 -msgid "Add E-mail Address" -msgstr "" - -#: .\photo21\templates\account\email.html:62 -msgid "Add E-mail" -msgstr "" - -#: .\photo21\templates\account\login.html:8 -#: .\photo21\templates\account\login.html:36 -msgid "Sign In" -msgstr "" - -#: .\photo21\templates\account\login.html:19 -#, python-format -msgid "" -"Please sign in with one of your existing third party accounts. Or, sign up for a %(site_name)s account and sign in " -"below:" -msgstr "" - -#: .\photo21\templates\account\login.html:26 -#, python-format -msgid "" -"If you have not created an account yet, then please sign up first." -msgstr "" - -#: .\photo21\templates\account\login.html:39 -msgid "Forgot Password?" -msgstr "" - -#: .\photo21\templates\account\login.html:42 -msgid "If any problem, please contact the server owners at" -msgstr "" - -#: .\photo21\templates\account\logout.html:8 -#: .\photo21\templates\account\logout.html:13 -#: .\photo21\templates\account\logout.html:22 -msgid "Sign Out" -msgstr "" - -#: .\photo21\templates\account\logout.html:16 -msgid "Are you sure you want to sign out?" -msgstr "" - -#: .\photo21\templates\account\signup.html:8 -msgid "Signup" -msgstr "" - -#: .\photo21\templates\account\signup.html:13 -#: .\photo21\templates\account\signup.html:24 -msgid "Sign Up" -msgstr "" - -#: .\photo21\templates\account\signup.html:16 -#, python-format -msgid "" -"Already have an account? Then please sign in." -msgstr "" - -#: .\photo21\templates\base.html:16 -msgid "The ENS Paris-Saclay pictures server." -msgstr "" - -#: .\photo21\templates\base.html:41 -msgid "Galleries" -msgstr "" - -#: .\photo21\templates\base.html:46 -msgid "Upload" -msgstr "" - -#: .\photo21\templates\base.html:51 -msgid "Manage" -msgstr "" - -#: .\photo21\templates\base.html:72 -msgid "Log out" -msgstr "" - -#: .\photo21\templates\base.html:82 -msgid "Log in" -msgstr "" - -#: .\photo21\templates\base.html:91 -msgid "Sign up" -msgstr "" - -#: .\photo21\templates\base.html:116 -msgid "Connected as" -msgstr "" - -#: .\photo21\templates\base.html:118 -msgid "Source code" -msgstr "" - -#: .\photo21\templates\index.html:8 -msgid "Home" -msgstr "" - -#: .\photo21\templates\index.html:11 -msgid "Welcome to the pictures server!" -msgstr "" - -#: .\photo21\templates\index.html:13 -msgid "" -"This website aims to collect the pictures and movies taken in the student " -"life of ENS Paris-Saclay or involving its students." -msgstr "" - -#: .\photo21\templates\index.html:20 -#, python-format -msgid "" -"The pictures are visible in the " -"galleries and are downloadable. However, the agreement of the " -"photographer and the persons present on the photo is necessary before any " -"republication on another platform. " -msgstr "" - -#: .\photo21\templates\index.html:29 -msgid "" -"If you want a photo to be deleted, please let us know: Abuse request" -msgstr "" - -#: .\photo21\templates\index.html:36 -msgid "" -"If you want to obtain the right to upload pictures, please let us know: Become a photograph" -msgstr "" - -#: .\photo21\templates\index.html:43 -msgid "Last galleries" -msgstr "" - -#: .\photo21\templates\index.html:52 -msgid "Behind the scene" -msgstr "" - -#: .\photo21\templates\index.html:54 -msgid "" -"Because we value your privacy, we do not sell the data on this site, unlike " -"many free online platforms. The dedicated server running this website is " -"kindly hosted by the Crans at the ENS " -"Paris-Saclay basement. It is not managed by the Crans. Current active " -"administrators are:" -msgstr "" - -#: .\photo21\templates\index.html:63 -msgid "They should be contacted at" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:8 -msgid "Account Connections" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:25 -msgid "" -"You can sign in to your account using any of the following third party " -"accounts:" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:53 -msgid "" -"You currently have no social network accounts connected to this account." -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:56 -msgid "Add a 3rd Party Account" -msgstr "" - -#: .\photo21\templates\socialaccount\snippets\provider_list.html:20 -msgid "Sign in with" -msgstr "" diff --git a/photo21/locale/es/LC_MESSAGES/django.po b/photo21/locale/es/LC_MESSAGES/django.po deleted file mode 100644 index a19cb2b..0000000 --- a/photo21/locale/es/LC_MESSAGES/django.po +++ /dev/null @@ -1,320 +0,0 @@ -# This file is part of photo21 -# Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay -# SPDX-License-Identifier: GPL-3.0-or-later -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-07 20:03+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" - -#: .\photo21\forms.py:16 -msgid "" -"Please enter a valid email address ending with `@crans.org` or `@ens-paris-" -"saclay.fr`." -msgstr "" - -#: .\photo21\forms.py:29 -msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`." -msgstr "" - -#: .\photo21\settings.py:171 -msgid "German" -msgstr "" - -#: .\photo21\settings.py:172 -msgid "English" -msgstr "" - -#: .\photo21\settings.py:173 -msgid "Spanish" -msgstr "" - -#: .\photo21\settings.py:174 -msgid "French" -msgstr "" - -#: .\photo21\templates\400.html:12 -msgid "Bad request" -msgstr "" - -#: .\photo21\templates\400.html:16 -msgid "" -"Sorry, your request was bad. Don't know what could be wrong. An email has " -"been sent to webmasters with the details of the error. You can now drink a " -"coke." -msgstr "" - -#: .\photo21\templates\403.html:12 -msgid "Permission denied" -msgstr "" - -#: .\photo21\templates\403.html:15 -msgid "You don't have the right to perform this request." -msgstr "" - -#: .\photo21\templates\403.html:17 .\photo21\templates\404.html:21 -msgid "Exception message:" -msgstr "" - -#: .\photo21\templates\404.html:12 -msgid "Page not found" -msgstr "" - -#: .\photo21\templates\404.html:16 -#, python-format -msgid "" -"The requested path %(request_path)s was not found on the server." -msgstr "" - -#: .\photo21\templates\500.html:12 -msgid "Server error" -msgstr "" - -#: .\photo21\templates\500.html:16 -msgid "" -"Sorry, an error occurred when processing your request. An email has been " -"sent to webmasters with the detail of the error, and this will be fixed " -"soon. You can go drink a soft." -msgstr "" - -#: .\photo21\templates\account\email.html:8 -#: .\photo21\templates\account\email.html:16 -#: .\photo21\templates\socialaccount\connections.html:16 -msgid "E-mail Addresses" -msgstr "" - -#: .\photo21\templates\account\email.html:11 .\photo21\templates\base.html:63 -#: .\photo21\templates\socialaccount\connections.html:11 -msgid "Account" -msgstr "" - -#: .\photo21\templates\account\email.html:19 -#: .\photo21\templates\socialaccount\connections.html:19 -msgid "Social connections" -msgstr "" - -#: .\photo21\templates\account\email.html:25 -msgid "The following e-mail addresses are associated with your account:" -msgstr "" - -#: .\photo21\templates\account\email.html:36 -msgid "Verified" -msgstr "" - -#: .\photo21\templates\account\email.html:38 -msgid "Unverified" -msgstr "" - -#: .\photo21\templates\account\email.html:40 -msgid "Primary" -msgstr "" - -#: .\photo21\templates\account\email.html:46 -msgid "Make Primary" -msgstr "" - -#: .\photo21\templates\account\email.html:47 -msgid "Re-send Verification" -msgstr "" - -#: .\photo21\templates\account\email.html:48 -#: .\photo21\templates\socialaccount\connections.html:47 -msgid "Remove" -msgstr "" - -#: .\photo21\templates\account\email.html:53 -msgid "Warning:" -msgstr "" - -#: .\photo21\templates\account\email.html:53 -msgid "" -"You currently do not have any e-mail address set up. You should really add " -"an e-mail address so you can receive notifications, reset your password, etc." -msgstr "" - -#: .\photo21\templates\account\email.html:57 -msgid "Add E-mail Address" -msgstr "" - -#: .\photo21\templates\account\email.html:62 -msgid "Add E-mail" -msgstr "" - -#: .\photo21\templates\account\login.html:8 -#: .\photo21\templates\account\login.html:36 -msgid "Sign In" -msgstr "" - -#: .\photo21\templates\account\login.html:19 -#, python-format -msgid "" -"Please sign in with one of your existing third party accounts. Or, sign up for a %(site_name)s account and sign in " -"below:" -msgstr "" - -#: .\photo21\templates\account\login.html:26 -#, python-format -msgid "" -"If you have not created an account yet, then please sign up first." -msgstr "" - -#: .\photo21\templates\account\login.html:39 -msgid "Forgot Password?" -msgstr "" - -#: .\photo21\templates\account\login.html:42 -msgid "If any problem, please contact the server owners at" -msgstr "" - -#: .\photo21\templates\account\logout.html:8 -#: .\photo21\templates\account\logout.html:13 -#: .\photo21\templates\account\logout.html:22 -msgid "Sign Out" -msgstr "" - -#: .\photo21\templates\account\logout.html:16 -msgid "Are you sure you want to sign out?" -msgstr "" - -#: .\photo21\templates\account\signup.html:8 -msgid "Signup" -msgstr "" - -#: .\photo21\templates\account\signup.html:13 -#: .\photo21\templates\account\signup.html:24 -msgid "Sign Up" -msgstr "" - -#: .\photo21\templates\account\signup.html:16 -#, python-format -msgid "" -"Already have an account? Then please sign in." -msgstr "" - -#: .\photo21\templates\base.html:16 -msgid "The ENS Paris-Saclay pictures server." -msgstr "" - -#: .\photo21\templates\base.html:41 -msgid "Galleries" -msgstr "" - -#: .\photo21\templates\base.html:46 -msgid "Upload" -msgstr "" - -#: .\photo21\templates\base.html:51 -msgid "Manage" -msgstr "" - -#: .\photo21\templates\base.html:72 -msgid "Log out" -msgstr "" - -#: .\photo21\templates\base.html:82 -msgid "Log in" -msgstr "" - -#: .\photo21\templates\base.html:91 -msgid "Sign up" -msgstr "" - -#: .\photo21\templates\base.html:116 -msgid "Connected as" -msgstr "" - -#: .\photo21\templates\base.html:118 -msgid "Source code" -msgstr "" - -#: .\photo21\templates\index.html:8 -msgid "Home" -msgstr "" - -#: .\photo21\templates\index.html:11 -msgid "Welcome to the pictures server!" -msgstr "" - -#: .\photo21\templates\index.html:13 -msgid "" -"This website aims to collect the pictures and movies taken in the student " -"life of ENS Paris-Saclay or involving its students." -msgstr "" - -#: .\photo21\templates\index.html:20 -#, python-format -msgid "" -"The pictures are visible in the " -"galleries and are downloadable. However, the agreement of the " -"photographer and the persons present on the photo is necessary before any " -"republication on another platform. " -msgstr "" - -#: .\photo21\templates\index.html:29 -msgid "" -"If you want a photo to be deleted, please let us know: Abuse request" -msgstr "" - -#: .\photo21\templates\index.html:36 -msgid "" -"If you want to obtain the right to upload pictures, please let us know: Become a photograph" -msgstr "" - -#: .\photo21\templates\index.html:43 -msgid "Last galleries" -msgstr "" - -#: .\photo21\templates\index.html:52 -msgid "Behind the scene" -msgstr "" - -#: .\photo21\templates\index.html:54 -msgid "" -"Because we value your privacy, we do not sell the data on this site, unlike " -"many free online platforms. The dedicated server running this website is " -"kindly hosted by the Crans at the ENS " -"Paris-Saclay basement. It is not managed by the Crans. Current active " -"administrators are:" -msgstr "" - -#: .\photo21\templates\index.html:63 -msgid "They should be contacted at" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:8 -msgid "Account Connections" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:25 -msgid "" -"You can sign in to your account using any of the following third party " -"accounts:" -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:53 -msgid "" -"You currently have no social network accounts connected to this account." -msgstr "" - -#: .\photo21\templates\socialaccount\connections.html:56 -msgid "Add a 3rd Party Account" -msgstr "" - -#: .\photo21\templates\socialaccount\snippets\provider_list.html:20 -msgid "Sign in with" -msgstr "" diff --git a/photo21/locale/fr/LC_MESSAGES/django.po b/photo21/locale/fr/LC_MESSAGES/django.po index de21f66..6c10127 100644 --- a/photo21/locale/fr/LC_MESSAGES/django.po +++ b/photo21/locale/fr/LC_MESSAGES/django.po @@ -1,163 +1,158 @@ # This file is part of photo21 # Copyright (C) 2022 Amicale des élèves de l'ENS Paris-Saclay # SPDX-License-Identifier: GPL-3.0-or-later -# -#, fuzzy + msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: photo21\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-12-07 20:03+0100\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"Language: \n" +"Language-Team: French\n" +"Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: .\photo21\forms.py:16 -msgid "" -"Please enter a valid email address ending with `@crans.org` or `@ens-paris-" -"saclay.fr`." -msgstr "" -"Veuillez entrer une adresse email valide finissant par `@crans.org` ou `@ens-" -"paris-saclay.fr`." +#: photo21/forms.py:16 +msgid "Please enter a valid email address ending with `@ens-rennes.fr`" +msgstr "Veuillez entrer une adresse e-mail valide finissant par `@ens-rennes.fr`." -#: .\photo21\forms.py:29 -msgid "Must end with `@crans.org` or `@ens-paris-saclay.fr`." -msgstr "Doit finir par `@crans.org` ou `@ens-paris-saclay.fr`." +#: photo21/forms.py:26 +msgid "Must end with `@ens-rennes.fr`." +msgstr "Doit finir par `@ens-rennes.fr`." -#: .\photo21\settings.py:171 -msgid "German" -msgstr "" - -#: .\photo21\settings.py:172 +#: photo21/settings.py:201 msgid "English" -msgstr "" +msgstr "Anglais" -#: .\photo21\settings.py:173 -msgid "Spanish" -msgstr "" - -#: .\photo21\settings.py:174 +#: photo21/settings.py:202 msgid "French" -msgstr "" +msgstr "Français" -#: .\photo21\templates\400.html:12 +#: photo21/templates/400.html:12 msgid "Bad request" -msgstr "" +msgstr "Requête incorrecte" -#: .\photo21\templates\400.html:16 +#: photo21/templates/400.html:16 msgid "" "Sorry, your request was bad. Don't know what could be wrong. An email has " "been sent to webmasters with the details of the error. You can now drink a " "coke." msgstr "" +"Désolé, votre requête était incorrecte. Un e-mail a été envoyé aux " +"administrateurs avec les détails de l'erreur. Vous pouvez aller boire un " +"coca." -#: .\photo21\templates\403.html:12 +#: photo21/templates/403.html:12 msgid "Permission denied" -msgstr "" +msgstr "Permission refusée" -#: .\photo21\templates\403.html:15 +#: photo21/templates/403.html:15 msgid "You don't have the right to perform this request." -msgstr "" +msgstr "Vous n'avez pas le droit d'effectuer cette requête." -#: .\photo21\templates\403.html:17 .\photo21\templates\404.html:21 +#: photo21/templates/403.html:17 photo21/templates/404.html:21 msgid "Exception message:" -msgstr "" +msgstr "Message d'exception :" -#: .\photo21\templates\404.html:12 +#: photo21/templates/404.html:12 msgid "Page not found" -msgstr "" +msgstr "Page introuvable" -#: .\photo21\templates\404.html:16 +#: photo21/templates/404.html:16 #, python-format msgid "" "The requested path %(request_path)s was not found on the server." msgstr "" +"Le chemin demandé %(request_path)s n'a pas été trouvé sur le " +"serveur." -#: .\photo21\templates\500.html:12 +#: photo21/templates/500.html:12 msgid "Server error" -msgstr "" +msgstr "Erreur serveur" -#: .\photo21\templates\500.html:16 +#: photo21/templates/500.html:16 msgid "" "Sorry, an error occurred when processing your request. An email has been " "sent to webmasters with the detail of the error, and this will be fixed " "soon. You can go drink a soft." msgstr "" +"Désolé, une erreur s'est produite lors du traitement de votre requête. Un e-" +"mail a été envoyé aux administrateurs avec les détails de l'erreur, et cela " +"sera corrigé prochainement. Vous pouvez aller boire un soda." -#: .\photo21\templates\account\email.html:8 -#: .\photo21\templates\account\email.html:16 -#: .\photo21\templates\socialaccount\connections.html:16 +#: photo21/templates/account/email.html:8 +#: photo21/templates/account/email.html:16 +#: photo21/templates/socialaccount/connections.html:16 msgid "E-mail Addresses" -msgstr "" +msgstr "Adresses e-mail" -#: .\photo21\templates\account\email.html:11 .\photo21\templates\base.html:63 -#: .\photo21\templates\socialaccount\connections.html:11 +#: photo21/templates/account/email.html:11 photo21/templates/base.html:66 +#: photo21/templates/socialaccount/connections.html:11 msgid "Account" msgstr "Compte" -#: .\photo21\templates\account\email.html:19 -#: .\photo21\templates\socialaccount\connections.html:19 +#: photo21/templates/account/email.html:19 +#: photo21/templates/socialaccount/connections.html:19 msgid "Social connections" msgstr "Connexions sociales" -#: .\photo21\templates\account\email.html:25 +#: photo21/templates/account/email.html:25 msgid "The following e-mail addresses are associated with your account:" -msgstr "" +msgstr "Les adresses e-mail suivantes sont associées à votre compte :" -#: .\photo21\templates\account\email.html:36 +#: photo21/templates/account/email.html:36 msgid "Verified" -msgstr "" +msgstr "Vérifié" -#: .\photo21\templates\account\email.html:38 +#: photo21/templates/account/email.html:38 msgid "Unverified" -msgstr "" +msgstr "Non vérifié" -#: .\photo21\templates\account\email.html:40 +#: photo21/templates/account/email.html:40 msgid "Primary" -msgstr "" +msgstr "Principal" -#: .\photo21\templates\account\email.html:46 +#: photo21/templates/account/email.html:46 msgid "Make Primary" -msgstr "" +msgstr "Définir comme principal" -#: .\photo21\templates\account\email.html:47 +#: photo21/templates/account/email.html:47 msgid "Re-send Verification" -msgstr "" +msgstr "Renvoyer la vérification" -#: .\photo21\templates\account\email.html:48 -#: .\photo21\templates\socialaccount\connections.html:47 +#: photo21/templates/account/email.html:48 +#: photo21/templates/socialaccount/connections.html:47 msgid "Remove" -msgstr "" +msgstr "Supprimer" -#: .\photo21\templates\account\email.html:53 +#: photo21/templates/account/email.html:53 msgid "Warning:" -msgstr "" +msgstr "Avertissement :" -#: .\photo21\templates\account\email.html:53 +#: photo21/templates/account/email.html:53 msgid "" "You currently do not have any e-mail address set up. You should really add " "an e-mail address so you can receive notifications, reset your password, etc." msgstr "" +"Vous n'avez actuellement aucune adresse e-mail configurée. Vous devriez " +"vraiment en ajouter une pour recevoir des notifications, réinitialiser votre " +"mot de passe, etc." -#: .\photo21\templates\account\email.html:57 +#: photo21/templates/account/email.html:57 msgid "Add E-mail Address" msgstr "Ajouter une Adresse E-mail" -#: .\photo21\templates\account\email.html:62 +#: photo21/templates/account/email.html:62 msgid "Add E-mail" msgstr "Ajouter un E-mail" -#: .\photo21\templates\account\login.html:8 -#: .\photo21\templates\account\login.html:36 +#: photo21/templates/account/login.html:8 +#: photo21/templates/account/login.html:36 msgid "Sign In" msgstr "Se Connecter" -#: .\photo21\templates\account\login.html:19 +#: photo21/templates/account/login.html:19 #, python-format msgid "" "Please sign in with one of your existing third party accounts. Or, inscrivez-vous pour un compte sur %(site_name)s " "et identifiez-vous ci-dessous :" -#: .\photo21\templates\account\login.html:26 +#: photo21/templates/account/login.html:26 #, python-format msgid "" "If you have not created an account yet, then please inscrire." -#: .\photo21\templates\account\login.html:39 +#: photo21/templates/account/login.html:39 msgid "Forgot Password?" msgstr "Mot de passe oublié ?" -#: .\photo21\templates\account\login.html:42 +#: photo21/templates/account/login.html:42 msgid "If any problem, please contact the server owners at" msgstr "En cas de problème, contactez les administrateurs à" -#: .\photo21\templates\account\logout.html:8 -#: .\photo21\templates\account\logout.html:13 -#: .\photo21\templates\account\logout.html:22 +#: photo21/templates/account/logout.html:8 +#: photo21/templates/account/logout.html:13 +#: photo21/templates/account/logout.html:22 msgid "Sign Out" msgstr "Déconnexion" -#: .\photo21\templates\account\logout.html:16 +#: photo21/templates/account/logout.html:16 msgid "Are you sure you want to sign out?" -msgstr "" +msgstr "Êtes-vous sûr de vouloir vous déconnecter ?" -#: .\photo21\templates\account\signup.html:8 +#: photo21/templates/account/signup.html:8 msgid "Signup" -msgstr "" +msgstr "Inscription" -#: .\photo21\templates\account\signup.html:13 -#: .\photo21\templates\account\signup.html:24 +#: photo21/templates/account/signup.html:13 +#: photo21/templates/account/signup.html:24 msgid "Sign Up" -msgstr "" +msgstr "S'inscrire" -#: .\photo21\templates\account\signup.html:16 +#: photo21/templates/account/signup.html:16 #, python-format msgid "" "Already have an account? Then please sign in." msgstr "" +"Vous avez déjà un compte ? Veuillez alors vous " +"connecter." -#: .\photo21\templates\base.html:16 -msgid "The ENS Paris-Saclay pictures server." -msgstr "" +#: photo21/templates/base.html:16 +msgid "The ENS Rennes pictures server." +msgstr "Le serveur photos de l'ENS Rennes." -#: .\photo21\templates\base.html:41 +#: photo21/templates/base.html:43 msgid "Galleries" msgstr "Galeries" -#: .\photo21\templates\base.html:46 +#: photo21/templates/base.html:48 msgid "Upload" -msgstr "Téléversement" +msgstr "Upload" -#: .\photo21\templates\base.html:51 +#: photo21/templates/base.html:53 msgid "Manage" -msgstr "Gestion" +msgstr "Manage" -#: .\photo21\templates\base.html:72 +#: photo21/templates/base.html:75 msgid "Log out" -msgstr "" +msgstr "Déconnection" -#: .\photo21\templates\base.html:82 +#: photo21/templates/base.html:85 msgid "Log in" -msgstr "" +msgstr "Connection" -#: .\photo21\templates\base.html:91 +#: photo21/templates/base.html:94 msgid "Sign up" msgstr "Inscription" -#: .\photo21\templates\base.html:116 +#: photo21/templates/base.html:119 msgid "Connected as" msgstr "Connecté en tant que" -#: .\photo21\templates\base.html:118 +#: photo21/templates/base.html:121 msgid "Source code" msgstr "Code source" -#: .\photo21\templates\index.html:8 +#: photo21/templates/index.html:8 msgid "Home" msgstr "Accueil" -#: .\photo21\templates\index.html:11 +#: photo21/templates/index.html:11 msgid "Welcome to the pictures server!" msgstr "Bienvenue sur le serveur photos !" -#: .\photo21\templates\index.html:13 +#: photo21/templates/index.html:13 msgid "" "This website aims to collect the pictures and movies taken in the student " -"life of ENS Paris-Saclay or involving its students." +"life of ENS Rennes or involving its students." msgstr "" -"Ce site à pour objectif de recenser les photos et films pris dans la vie " -"associative de l'ENS Paris-Saclay ou impliquant ses usager·ères." +"Ce site a pour objectif de recenser les photos et films pris dans la vie " +"associative de l'ENS Rennes ou impliquant ses étudiant·es." -#: .\photo21\templates\index.html:20 +#: photo21/templates/index.html:20 #, python-format msgid "" "The pictures are visible in the " @@ -275,73 +272,77 @@ msgstr "" "photographe et des personnes présentes sur la photo est nécessaire avant " "toute republication sur un autre site." -#: .\photo21\templates\index.html:29 -msgid "" -"If you want a photo to be deleted, please let us know: Abuse request" -msgstr "" -"Si vous souhaitez qu'une photo soit supprimée, signalez le nous : Signaler un abus" - -#: .\photo21\templates\index.html:36 +#: photo21/templates/index.html:30 msgid "" "If you want to obtain the right to upload pictures, please let us know: Become a photograph" msgstr "" "Si vous souhaitez obtenir les droits photographes pour téléverser vos " -"photos, signalez le nous : Devenir photographe" -#: .\photo21\templates\index.html:43 +#: photo21/templates/index.html:38 msgid "Last galleries" msgstr "Galeries récentes" -#: .\photo21\templates\index.html:52 +#: photo21/templates/index.html:47 msgid "Behind the scene" -msgstr "Derrière la scène" +msgstr "Behind the scene" -#: .\photo21\templates\index.html:54 +#: photo21/templates/index.html:49 msgid "" -"Because we value your privacy, we do not sell the data on this site, unlike " -"many free online platforms. The dedicated server running this website is " -"kindly hosted by the Crans at the ENS " -"Paris-Saclay basement. It is not managed by the Crans. Current active " -"administrators are:" +" " +"The dedicated server running this website is kindly hosted by Sinfonie at the ENS Rennes. " +" " +"Le serveur qui fait fonctionner ce site est gentiment hébergé par " +"Sinfonie à l'ENS Rennes. " +" {% endblock %} diff --git a/photo21/templates/base.html b/photo21/templates/base.html index eeca7fd..be85aab 100644 --- a/photo21/templates/base.html +++ b/photo21/templates/base.html @@ -13,7 +13,7 @@ SPDX-License-Identifier: GPL-3.0-or-later {% block title %}{{ title }}{% endblock title %} - {{ request.site.name }} - + @@ -56,6 +56,21 @@ SPDX-License-Identifier: GPL-3.0-or-later {% endif %} {% endif %} -
+
{% for photo in photos %} - - {{ photo.title }}{% if photo.date_taken %} - {{ photo.date_taken|date }} {{ photo.date_taken|time }}{% endif %}{% if photo.owner.get_full_name %} - {{ photo.owner.get_full_name }}{% else %} - {{ photo.owner.username }}{% endif %}{% if photo.license %} - {{ photo.license }}{% endif %}{% if not photo.is_public %} - !PRIVATE!{% endif %} + + {{ photo.title }}{% if photo.date_taken %} - {{ photo.date_taken|date }} {{ photo.date_taken|time }}{% endif %}{% if photo.owner.get_full_name %} - {{ photo.owner.get_full_name }}{% else %} - {{ photo.owner.username }}{% endif %}{% if photo.license %} - {{ photo.license }}{% endif %}{% if not photo.is_public %} - !PRIVATE!{% endif %} {% endfor %}
diff --git a/photologue/views.py b/photologue/views.py index c44b1f8..a523fa1 100644 --- a/photologue/views.py +++ b/photologue/views.py @@ -237,6 +237,7 @@ class GalleryPublicView(DetailView): if request.user.is_authenticated: gallery = self.get_object() return redirect("photologue:pl-gallery", slug=gallery.slug) + request.session['public_gallery_access'] = True request.guest_mode = True return super().get(request, *args, **kwargs) diff --git a/requirements.txt b/requirements.txt index 3f38e2d..56bdc65 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,3 +6,7 @@ ExifRead>=2.1.2 Pillow>=6.0.0 django-debug-toolbar>=3.2.0 python-decouple>=3.6 +whitenoise>=6.0 +psycopg2-binary>=2.9 +requests>=2.25 +gunicorn>=21.0 diff --git a/tox.ini b/tox.ini index cc05d77..55bb7f6 100644 --- a/tox.ini +++ b/tox.ini @@ -27,7 +27,7 @@ deps = pep8-naming pyflakes commands = - flake8 allauth_note_kfet photo21 photologue + flake8 allauth_oauth photo21 photologue [flake8] ignore = W503, I100, I101