Giter Site home page Giter Site logo

ateliersoude / openrepairplatform Goto Github PK

View Code? Open in Web Editor NEW
33.0 8.0 15.0 16.11 MB

OpenRepairPlatform is a web application based on Django designed to organizing collaborative and non-profits repair structures - Still in development

Python 42.56% Shell 0.29% HTML 32.93% JavaScript 5.98% Dockerfile 0.18% SCSS 18.05% Sass 0.01%
repair-management non-profit-organizations collaborative event-management membership-management community django-project

openrepairplatform's Introduction

OpenRepairPlatform

Ce projet cherche à faciliter l’accessibilité de la réparation par le plus grand nombre. Par une interface simple et claire, l'application web invite participants et organisations à collaborer autours de l’auto-réparation et de la réparation participative.

OpenRepairPlateform est une application basée sur Django, pensée pour organiser les structures de réparations participatives. Elle intègre principalement des fonctionnalités de gestion d'organisation, de membres, de comptabilité, la publication d'événements, d'inventaire et de suivi/partage de réparations.

Cette application est développée et notamment utilisée par l'Atelier Soudé pour la plateforme Réparons.

Toute la documentation d'installation et d'utilisation est disposible ici.

----- ENG -----

This application is still in developpment. Any contributes are welcome. Please contact us if you want to contribute and we tell you how to.

Atelier Soudé

OpenRepairPlatform is a Django based application designed to organize collaborative repair structures, features provides organization managment, event publishing, community members managment, repair tracking and sharing.

The plateform is created by Atelier Soudé, an organization which repair everyday's people electric and electronic objects in Lyon, France.

Full installation and user documentation are avalaible here. (sorry, only in French at this point !)

For basic develop installation, follow those steps:

Run the application (in Develop mode only)

1.Set django, postgres and nginx/domain variables in openrepairplatform/.env

2.Run the following command:

docker-compose up

You can then access http://127.0.0.1:8000/ and log with the admin user [email protected] // adminpass

3.Create an organization within the http://127.0.0.1:8000/organizations path and you can start everythings else (further documentation will come)

Debug with Visual Studio Code

If you open the main folder with vs code, you will be able to use the configuration present in .vscode.

This will allow you to connect to the container in debug mode and to stop at breakpoints in the code, which is quite confortable to inspect the variables and test new code in the required state of the program (typically before a failure). Before starting, you may have to install the Python extension.

For this, just click on Debug, and Start Debugging: you will run the Debug Django app configuration. A small additional bar will appear with useful commands for the debug: go to next breakpoint, stop debugging, etc More information on debugging with vs code: https://code.visualstudio.com/Docs/editor/debugging

Create a breakpoint in the code, for example in a view, and go to the corresponding page from your browser. The browser will freeze and vs code will stop at the breakpoint.

In the lower part of vs code, in the DEBUG CONSOLE, you can test code.

In the debug section, in the left vertical bar, you can see all the breakpoints, all the variables and their content, and the call stack. You can click on any step of the call stack, and browser the variables, test some code, etc, at this step.

Coding "live"

The local code is mounted in a Docker volume, so if you change the code locally and refresh your browser, you will immediatly see the changes.

Run unit tests

First, start the containers with docker-compose up Then, run the tests with docker exec openrepairplatform_django_1 pytest --disable-pytest-warnings --cov=openrepairplatform --cov-report term-missing

Run integration tests

Integration tests are run using a Docker image containing a chrome Selenium installation and a VNC server. It is possible to debug the tests using a local VNC client that connects to the VNC server in the Docker container, that allows to graphically see what the selenium test is doing on the site.

To install the VNC client on your local computer:

sudo apt-get install krdc

To launch it:

krdc

Start KRDC, and connect to localhost:5900

To see the running chrome sessions: http://localhost:4444/wd/hub/static/resource/hub.html

To launch the tests :

First, start the Docker containers with docker-compose up, and then:

docker exec openrepairplatform_selenium_1 python3 -m pytest /tests/integration_tests.py -v

If you uncomment the following lines, it will wait for a debugger to connect before running the tests

ptvsd.enable_attach()
ptvsd.wait_for_attach()

openrepairplatform's People

Contributors

chadek avatar clemsp avatar cmention avatar dependabot[bot] avatar dmorel avatar dynnammo avatar fababy973 avatar geocali avatar jum-s avatar luciend avatar samir-ben avatar simthem avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

openrepairplatform's Issues

[Celery] no module nammed 'actstrem'

[Celery] not found the module 'actream'

celeryworker_1           | Error in sys.excepthook:
celeryworker_1           | Traceback (most recent call last):
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/colored_traceback/colored_traceback.py", line 27, in colorize_traceback
celeryworker_1           |     tb_colored = pygments.highlight(tb_text, lexer, self.formatter)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/colored_traceback/colored_traceback.py", line 32, in formatter
celeryworker_1           |     colors = _get_term_color_support()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/colored_traceback/colored_traceback.py", line 66, in _get_term_color_support
celeryworker_1           |     curses.setupterm()
celeryworker_1           | _curses.error: setupterm: could not find terminfo database
celeryworker_1           | 
celeryworker_1           | Original exception was:
celeryworker_1           | Traceback (most recent call last):
celeryworker_1           |   File "/usr/local/bin/celery", line 11, in <module>
celeryworker_1           |     sys.exit(main())
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/__main__.py", line 16, in main
celeryworker_1           |     _main()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 322, in main
celeryworker_1           |     cmd.execute_from_commandline(argv)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 496, in execute_from_commandline
celeryworker_1           |     super(CeleryCommand, self).execute_from_commandline(argv)))
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/base.py", line 275, in execute_from_commandline
celeryworker_1           |     return self.handle_argv(self.prog_name, argv[1:])
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 488, in handle_argv
celeryworker_1           |     return self.execute(command, argv)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/celery.py", line 420, in execute
celeryworker_1           |     ).run_from_argv(self.prog_name, argv[1:], command=argv[0])
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/worker.py", line 223, in run_from_argv
celeryworker_1           |     return self(*args, **options)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/base.py", line 238, in __call__
celeryworker_1           |     ret = self.run(*args, **kwargs)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/bin/worker.py", line 257, in run
celeryworker_1           |     **kwargs)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/worker/worker.py", line 96, in __init__
celeryworker_1           |     self.app.loader.init_worker()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/loaders/base.py", line 114, in init_worker
celeryworker_1           |     self.import_default_modules()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/loaders/base.py", line 108, in import_default_modules
celeryworker_1           |     raise response
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/utils/dispatch/signal.py", line 288, in send
celeryworker_1           |     response = receiver(signal=self, sender=sender, **named)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/fixups/django.py", line 82, in on_import_modules
celeryworker_1           |     self.worker_fixup.validate_models()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/fixups/django.py", line 120, in validate_models
celeryworker_1           |     self.django_setup()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/celery/fixups/django.py", line 116, in django_setup
celeryworker_1           |     django.setup()
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/django/__init__.py", line 27, in setup
celeryworker_1           |     apps.populate(settings.INSTALLED_APPS)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/django/apps/registry.py", line 85, in populate
celeryworker_1           |     app_config = AppConfig.create(entry)
celeryworker_1           |   File "/usr/local/lib/python3.6/site-packages/django/apps/config.py", line 94, in create
celeryworker_1           |     module = import_module(entry)
celeryworker_1           |   File "/usr/local/lib/python3.6/importlib/__init__.py", line 126, in import_module
celeryworker_1           |     return _bootstrap._gcd_import(name[level:], package, level)
celeryworker_1           |   File "<frozen importlib._bootstrap>", line 994, in _gcd_import
celeryworker_1           |   File "<frozen importlib._bootstrap>", line 971, in _find_and_load
celeryworker_1           |   File "<frozen importlib._bootstrap>", line 953, in _find_and_load_unlocked
celeryworker_1           | ModuleNotFoundError: No module named 'actstream'

documentation @jum-s : https://www.revsys.com/tidbits/celery-and-django-and-docker-oh-my/

Suggestion: faciliter la création des events récurents

Hello, merci d'avoir mis en place la plateforme de test pour nous, c'est super.

J'explore au fur et à mesure, à la fois du point de vue technique, et du côté utilisateur (selon nos diférents persona).

Concernant la création de nouveaux events, nous avons pour l'instant surtout des activités récurrentes, ce qui doit être le cas j'imagine de la plupart des assoces.

Du coup, ce sont principalement les dates qui vont systématiquement changer, alors que généralement horaires, lieux, conditions vont avoir tendance à rester les mêmes d'une séance à la suivante.

Du coup j'aimerais vous proposer,
plutôt que d'avoir toujours à répéter les mêmes infos quand on crée un nouvel event,
ou bien de créer des "modèles/templates" intermédiaire qui alourdiraient la structure de l'application,
de pré-remplir les champs (hors date et date publication) par defaut avec les mêmes infos que le dernier event du même type créé par l'organisation (une fois le type d'event choisi)

Qu'est-ce que vous en dites?

Factoriser réservation d'événement

Pour l'instant sur la branche modal-overhaul il y a une implémentation relativement bonne de la réservation (gestion des membres actifs qui prennent pas de places etc) mais sur add-user-to-event il faut aussi réserver, avec d'autres considérations, il faudra donc quand on fusionne les deux refactoriser le code pour que les deux utilisent la même fonction

formating phone numbers when displayed

Bonjour,
Qu'est-ce que vous penseriez de formatter les numéros de téléphone, par exemple en utilisant une librairie comme python-phonenumbers

En utilisant soit une propriété formatted_phone ou un templatetag / templatefilter
exemples d'implémentation: https://stackoverflow.com/a/9354685/12505071

actuellement, on a un numéro limité à 10 chiffres, sans espaces:
image

en déclarant dans les settings
COUNTRY = FR, on obtiendrait 06 15 12 56 25
et
COUNTRY = CH, on obtiendrait 021 632 25 65

Qu'est-ce que vous en dites?

Inversion Latitude Longitude

Selon les conventions, les geolocalisations sont listées dans l'ordre latitude, longitude
or, aussi bien dans le model que dans le formulaire, ils ont été listés dans l'ordre inverse.

Du coup, quand j'ai créé mon premier lieu, j'ai cru qu'il y avait un problème car votre super système de cartes affichait ... rien.

serait-il possible d'inverser dans le model comme dans

class PlaceForm(ModelForm):
    longitude = forms.CharField(widget=forms.HiddenInput)
    latitude = forms.CharField(widget=forms.HiddenInput)

l'ordre des deux fields ?

Si vous voulez, je peux aussi le faire directement

Deploiement Docker

Hello,

Je suis en train d'essayer depuis plusieurs jours d'installer l'application via Docker.

Sur la branch Master ça ne fonctionne plus, mais sur la branche Dev ça semble aller.

Au moment de démarrer les app, j'ai un soucis avec Nginx :

nginx: [emerg] host not found in upstream "openrepairplatform_python:8000" in /etc/nginx/sites-enabled/default:2

Une idée de ce qui pourrait bloquer ?

merci
Nico

Problems with requirements using pip

Hello,

quand j'essaye d'installer sur ma machine (PC), j'ai un probleme avec les requirements, et plus spécifiquement tatsu.
le message de pip:
image
en regardant sur le net, je trouve bien la version 5.6.1
mais je n'arrive pas à détermnier à quoi ça sert

et la doc https://tatsu.readthedocs.io/en/v5.6.1/rationale.html ne m'aide pas trop

En plus, si je fais une recherche sur la branche dev, je ne trouve pas de référence à tatsu.

Du coup, y a-t-il une raison pour le garder dans les requirements?

en plus, il apparaît que tatsu>4.2 soit un requirement pour un des composants,
et il s'installe de toute façon:

image

Je reçois de plus ce message d'erreur:
image
là encore, pas de référence à six dans notre code dans la branche dev.

est-ce que ça fait du coup du sens d'avoir cet import dans nos requirements:

six==1.16.0
    # via
    #   bleach
    #   django-autocomplete-light
    #   html5lib
    #   ics
    #   python-dateutil

Organisation pour synchroniser development FR/CH

Salut, j'aurais une petite question d'organisation.

Lorsque nous faisons une amélioration, cela peut être :

  • Spécifique FR
  • Spécifique CH
  • commun (genre correction de bugs, fautes d'orthographe, ou feature comme certains proposés dans les issues ...)

du coup, est-ce que ça ne ferait pas du sens d'avoir une branche dev_base commune, puis deux branches filles dev_FR et dev_CH
et de changer le node point de départ de dev_FR et dev_CH au fure et à mesure des commits sur dev_base ?

Il faudrait faire un git rebase à chaque fois qu'on veut mettre dev_FR ou dev_CH à jour avec les changements de dev_base ?

Ou bien y a-t-il une meilleure solution?

Suggestion: faciliter la gestion des animateurs par séances

Hello,

j'ai deux suggestions concernant la gestion des animateurs:

1/ quand on ouvre un évènement donné, on voit le nombre de participants et d'animateurs:
image
c'est super bien fait

quand on est sur la liste des évènements, serait il possible de rajoutter, pour les admin, volunteers (et actives ? -> je ne suis pas très clair sur qui ils sont dans votre modèle) le nombre des animateurs.
Ca serait pratique pour qu'ils aient rapidement une vue d'ensemble de quand il manque du monde ... et éventuellement s'inscrire pour cette date, ou bien contacter des animateurs
image

Cette première sugestion est assez simple à implémenter.
Les 2 autres seraient moins prioritaires:

2/ On pourrait aussi rajoutter éventuellement le concept d'animateurs disponible en backup, disponible au cas où on ait des désistements ou des maladies

2bis/ De façon similaire, on pourrait introduire dans un second temps le concept de liste d'attente pour les visiteurs (genre 20% du nombre de participants) aussi en cas de désistement

Issue launching OpenRepairPlatform localy on PC

Salut,

Lorsqu'on avait discuté au téléphone en décembre, vous m'aviez dit que pour tester des modifications du code, je pouvais lancer l'appli localement avec un classique

py manage.py makemigrations
py manage.py migrate
py manage.py runserver

or j'ai un problème de compilation lors du makemigrations:
django.core.exceptions.ImproperlyConfigured: Could not find the GDAL library (tried "gdal302", "gdal301", "gdal300", "gdal204", "gdal203", "gdal202", "gdal201", "gdal20"). Is GDAL installed? If it is, try setting GDAL_LIBRARY_PATH in your settings.

sur internet, il est suggéré d'installer GAL:
pip install GDAL
qui n'est pas dans les requirements

ou bien encore:
https://stackoverflow.com/a/49159195/12505071

What would be your recommended way to solve this ?

I want o to help you in this.

Hey Guys. I am sorry if this is not the right place, but you have in your readme to contact you in case if someone wants to contribute.
So how can I help you to develop? How do I start? How can I setup my local environment?

Thanks in advance.

Localisation for country specificities (incl. currency)

Salut,

je propose d'introduire dans settings/base.py les variables globales suivantes afin de faciliter l'intégration dans la branche commune de spécificités pays telles que:
1/ monnaie
2/ gestion zip codes
3/ ... à déterminer aussi en fonction du degré d'intégration qu'on voudra obtenir, tout en permettant une intégration totale

COUNTRY = 'FR'  #'CH', 'US' 

CURRENCIES = {
	'FR' : ['EUR', '€'],
	'CH' : ['CHF', 'CHF'],
	'US' : ['USD', '$'],
}
CURRENCY_DISPLAY = CURRENCIES[COUNTRY][1]
CURRENCY_CODE = CURRENCIES[COUNTRY][0]

Ca serait ok pour vous?

L'idée pour moi ce serait d'avoir toujours un comportement par défaut qui est le comportement en France,
et si nécessaire un comportement spécifique le cas échéant suivant le pays:

if settings.COUNTRY == 'CH':
    pass # adaptation des variables pour la suisse

ou

if settings.COUNTRY == 'CH':
    pass #comportement pour CH
else:
   pass #comportement par défaut (pour FR)

OK aussi sur le principe?

si vous êtes ok sur le principe, je peux faire l'implémentation, y compris sur le display de la monnaie (qui est le truc qu'on doit absolument faire avant de pouvoir mettre la plateforme en service chez nous)

bug(event): On ne peut pas mettre de description sur un nouvel event et sousmettrele formulaire

Proxy {date: '2022-12-20', publish_at: '2022-12-20T16:54', starts_at: '17:00', ends_at: '18:00', updated: false, …}[[Handler]]: ObjectdeleteProperty: ƒ deleteProperty(target, key)get: ƒ get2(target, key, receiver)has: ƒ has(target, key)ownKeys: ƒ ownKeys(target)set: ƒ set2(target, key, value, receiver)[[Prototype]]: Object[[Target]]: Objectactivity: {model: 'event.activity', pk: 6, fields: {…}}allow_stuffs: trueavailable_seats: 0booking: truecollaborator: ""conditions: [Proxy]date: "2022-12-20"description: Proxy[[Handler]]: ObjectdeleteProperty: ƒ deleteProperty(target, key)get: ƒ get2(target, key, receiver)has: ƒ has(target, key)ownKeys: ƒ ownKeys(target)set: ƒ set2(target, key, value, receiver)[[Prototype]]: Object[[Target]]: Delta[[IsRevoked]]: falseends_at: "18:00"external: falseexternal_url: ""is_free: truelocation: {model: 'location.place', pk: 8632, fields: {…}}members_only: trueneeded_organizers: 0organizers: []publish_at: "2022-12-20T16:54"recurrent: "non"starts_at: "17:00"updated: false[[Prototype]]: Objectconstructor: ƒ Object()hasOwnProperty: ƒ hasOwnProperty()isPrototypeOf: ƒ isPrototypeOf()propertyIsEnumerable: ƒ propertyIsEnumerable()toLocaleString: ƒ toLocaleString()toString: ƒ toString()valueOf: ƒ valueOf()__defineGetter__: ƒ __defineGetter__()__defineSetter__: ƒ __defineSetter__()__lookupGetter__: ƒ __lookupGetter__()__lookupSetter__: ƒ __lookupSetter__()__proto__: (…)get __proto__: ƒ __proto__()set __proto__: ƒ __proto__()[[IsRevoked]]: false
vue.apps.bundle.js:681 POST https://reparons.org/api/event/ 400
Error: Request failed with status code 400
at createError (vue.apps.bundle.js:331:21)
at settle (vue.apps.bundle.js:347:18)
at XMLHttpRequest.onloadend (vue.apps.bundle.js:595:13)

Créer un package dédié aux mails?

Pour l'instant la seule fonction mail est send_booking_mail, mais en passant la réservation d'un formulaire à un api, je me demande si c'est pas une bonne idée de mettre tous les trucs liés aux mails dans leur propre package (sans urls.py vraiment interne) pour qu'elles soient plus indépendantes et plus tard rapidement accessible par celery?

Pas de longitude/latitude une fois sur deux pour Clément

Non reproductible chez Bastien, problème lors de l'ajout d'une adresse, le code postal ne s'ajoute vraissemblablement pas même en selectionnant l'adresse depuis la liste proposée par l'API google, ce qui fait que latitude/longitude sont nuls, donc inutilisables pour leaflet.

Bug: création d'event sans limite de place

Si on essaye de créer un événement sans limite de place, cela ne fonctionne pas. Pour contrer, il faut au préalable mettre un nombre de participants puis cocher la case "sans limite de participants".

Taille du bouton Réserver trop grande par rapport aux boutons trash/edit

Ce qui cause un problème d'affichage, la boîte avec le bouton réserver est légèrement plus grande que celle sans, ce qui cause une erreur d'alignement.

image
^Avec mélange de réserver/trash edit (noter la différence entre le 25/07 à 13h33 et celui à sa droite)

image
^Avec que des boutons réserver

Page Organizations: pb de placement des logos et des "titres" dans les cards

Il semble y avoir des problèmes avec les logos et les noms d'organisation qui semblent pas mal dépasser des cards (pb de resize?), aussi bien en mode telphone que browser normal (en tout cas sur mon Chrome)

https://reparons.org/user/organizations/
http://test-openrepair.repaircafe-lausanne.ch/user/organizations/

code: openrepairplatform/user/templates/user/organization/organization_card.html

il semblerait que la card essaye de s'étirer / se répartir sur le maximum de colonnes si on regarde les deux sites
Chez nous, c'est comme s'il y avait une ligne vide dans la première colonne, le logo dans la 2e, et le titre sur la 3e colonne

essayez aussi de rétrécir la fenetre de browsing, ca fait des trucs marrants, et il ne semble pas avoir de resizing des logos

Réparer les permissions

Depuis le changement de logique qu'avait dû faire Bastien, les permissions ne sont plus fonctionnelles.
Il faudrait savoir pourquoi et réparer cela.
Ce sont sûrement les prédicats du fichiers rules.py qui ne sont plus bons.

De ce fait, j'ai du supprimer toutes les mentions du genre
permission_required = 'plateformeweb.create_activity'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.