Code Monkey home page Code Monkey logo

copanier's Introduction

Copanier

Copanier is a software to make grouped orders. It's generally used by small groups who want to buy food supplies directly from producers, without requiring each individual to see each producer.

It helps people to order a set of defined products, and provide a few helpers to ease the life of everyone involved :-)

How does it work?

  1. A new delivery is created ;
  2. Producers and products are created in the software (or copied from a past delivery) ;
  3. (Optional : prices are checked with the producers to be sure they are still okay) ;
  4. Individuals place their orders for their groups ;
  5. Referents ask their producers for the products and pay them ;
  6. There is a delivery - the tool provides summary of who ordered what ;
  7. A dispatch of who has to pay whom is done ;
  8. XXX
  9. ... Profit !

Features

  • Handles groups of people (useful for people sharing a house) ;
  • Handles multiple producers in one delivery ;
  • Intelligent dispatching of payments, without any central bank account ;
  • Support for shipping fees ;

Screenshots

Login screen Login screen Login screen Login screen Login screen

Philosophy

  • Keep things simple.
  • Do not rely on JavaScript (or the less possible)
  • Lower the cost of maintainance of the project

FAQ

How files are stored? Does this rely on a database?

The current implementation of copanier doesn't need an external database, and relies on YAML files instead. It's done to keep things simple and easy to work with / backup, and we believe the needs for a database are very little, since we would very rarely have multiple writes at the same time.

How is it different from cagette?

Cagette is a free software which aims at solving a larger problem that what we're solving. Cagette has a more general approach, providing a tool that can be used by groups of producers, AMAPs, people having a physical store, and group of consumers.

In copanier, we only focus on groups of consumers. We want to keep things as straightforward and effective as possible, by keeping the problem small. We do one thing and we try to do it the best way we can! We believe copanier is better suited for people who want to organise the way we do, but if copanier doesn't fit your needs, cagette might :-)

Install copanier locally

Get the system dependencies

You might need to install some system dependencies. On Debian-based systems, you can install the dependencies with this command:

sudo apt install python3-dev python3-venv python3-pip libcairo-dev libpango1.0-dev

The project relies on Python 3.7+, so if you don't have it yet, here's your chance!

One way to install it is to use pyenv:

pyenv install 3.7.1
pyenv global 3.7.1

Install copanier

We recommend to use virtualenv so everything is installed separately from the rest of the system:

# Get the source code locally
git clone https://github.com/spiral-project/copanier.git
cd copanier

# Create the virtualenv
python -m venv venv
# On some systems, you might need to specify "python3.7 -m venv venv"

# Activate it!
source venv/bin/activate

# install everything!
pip install -e .

Running in docker

For this, you need to have docker and docker-compose installed.

To give a try to Copanier quickly, you can use docker:

cd docker
sudo docker-compose -p copanier up

The app will be available at http://localhost:2244.

Database is saved under db folder. This folder is mounted in app container to persist data changes on host disk.

For development purpose, you can use both docker-compose.yml and docker-compose-dev.yml which allows you to work on copanier source code and make gunicorn automatically reload workers when code changes:

sudo docker-compose -p copanier -f docker-compose.yml -f docker-compose-dev.yml up

Run local server

Once everything is installed, you can use the copanier command to run the server.

Make sure venv is active, then:

copanier serve

Optionally autoreload the server when you change a python file (needs hupper):

copanier serve --reload

Then browse to http://localhost:2244

Run the tests

If you want to contribute, don't hesitate! In this case, it might be helpful to install a few other dependencies.

pip instal -e .[test]

Then, to run the tests:

# install the required dependencies for dev
pip install -r requirements-dev.txt
# run the tests
py.test tests

Configuration

Copanier uses environment variables to configure its behaviour. All the configuration flags are specified in this config.py file and in order to use them, you will need to set them, considering their name starts with COPANIER_.

One simple way to handle this behaviour, is to have a config.env file and source it (with source config.env) before starting the server. Here is how this file could look like:

export COPANIER_SITE_URL="https://yourdomain.com"
export COPANIER_SITE_NAME="Your site name"
export COPANIER_SITE_DESCRIPTION="Site long description"
export COPANIER_XLSX_FILENAME="crac-produits"
export COPANIER_SEND_EMAILS=True
export COPANIER_SMTP_HOST="mail.gandi.net"
export COPANIER_SMTP_PASSWORD="something"
export COPANIER_SMTP_LOGIN="yourlogin"
export COPANIER_FROM_EMAIL="[email protected]"
export COPANIER_DOMAIN="tld.com"
export COPANIER_EMAIL_SIGNATURE="The team"
export COPANIER_STAFF="[email protected] [email protected]"

Deployment

If you're running the application locally, then just running it with copanier serve might be enough, but if you want to deploy it in production, the best way to make this run is to rely on a WSGI server. One good option is gunicorn.

You can run it with this command:

gunicorn -k roll.worker.Worker copanier:app --bind [$IP]:$PORT

Installation on AlwaysData

AlwaysData has a free plan capable of hosting copanier. Here are the steps to install there :

  1. Create a free account
  2. Connect via ssh
  3. git clone https://github.com/spiral-project/copanier.git
  4. Create the venv with python3.9 -m venv venv (using python 3.9 right now to avoid issues with cython)
  5. Create a copanier.env and runserver.sh file with the contents below
export COPANIER_SITE_NAME="Copanier"
export COPANIER_SITE_URL="https://xxx.alwaysdata.net"
export COPANIER_SITE_DESCRIPTION="Copanier"
export COPANIER_XLSX_FILENAME="produits"
export COPANIER_SEND_EMAILS=True

export COPANIER_SMTP_HOST="xxx"
export COPANIER_SMTP_PASSWORD="xxx"
export COPANIER_SMTP_LOGIN="xxx"

export COPANIER_FROM_EMAIL="xxx"
export COPANIER_EMAIL_SIGNATURE="Copanier"
export COPANIER_STAFF=""
#!/bin/bash
source copanier.env && /home/copanier/venv/bin/gunicorn -k roll.worker.Worker copanier:app --bind [$IP]:$PORT

Then in the admin pannel create a website with a custom script that runs /runserver.sh and another site which points to the static files. You should be good to go.

Fork

This project is a continuation of the work done by Yohan, on top of which we added the notion of groups, multiple producers, payment repartition etc.

copanier's People

Contributors

almet avatar aurelienshz avatar dependabot-preview[bot] avatar encrypt94 avatar gwenael-f avatar indatwood avatar manu5801 avatar natim avatar thecapslock avatar vinyll avatar yohanboniface 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

Watchers

 avatar  avatar  avatar

copanier's Issues

Support multiple groups

It could be cool that one instance of copanier handles multiple groups.

Also, we might need rework the wording here, to distinguish:

  • Ordering entity : A collection of persons that can place orders. It could be families or shared houses, for instance;
  • A cooperative : A collection of ordering entities.

I'm not sure about the naming here. Any help is appreciated :-)

Afficher clairement les étapes de fonctionnement

  1. Mise à jour des référent·es
  2. Mise à jour des prix (par les référent·es)
  3. Commande (par les groupes)
  4. Récupération des produits (par les référen·tes)
  5. Distribution
  6. Validation des produits récupérés
  7. Répartition des paiements
  8. Paiements

Change default values for the site

At some locations it says « epinamap » which is the group the original author belongs to, but we probably don't want to have this here.

Configure the app URL

Given the following nginx configuration:

server {

	listen 80;

	location /copanier/ {
	  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	  proxy_set_header X-Forwarded-Proto $scheme;
	  proxy_set_header X-Real-IP $remote_addr;
	  proxy_set_header Host $http_host;
	  proxy_pass http://127.0.0.1:2244/;
	  proxy_redirect off;

 	}
}

When I go to http://localhost/copanier/, the app redirects me to http://localhost/connexion?next=/ — instead of the expected http://localhost/copanier/connexion?next=/.

I'm not yet sure where the problem happens, in the app itself, or Nginx.

enhance packaging info

Maybe we should fold it, or we should put a sane default in this field (1?). Or just rename it to "ajuster le colisage", or something else? Ideas?

Add a onInput pretty phone number

/* Handle nice phone number formatting */
function prettifyPhoneNumber() {
  var $phone = $(this)

  var phone = $phone.val()

  phone = phone.replace(/[^0-9]/g, '') // Only keep digits
  phone = (function addSpaces(phone) {
    if (phone.length <= 2) {
      return phone
    }
    return phone.substring(0, 2) + ' ' + addSpaces(phone.substring(2))
  }(phone))

  $phone.val(phone)
}

Error when sending email?

Traceback (most recent call last):
File "/home/alexis/copanier/venv/lib/python3.7/site-packages/roll/init.py", line 77, in call
await handler(request, response, **request.route.vars)
File "/home/alexis/copanier/copanier/views/delivery.py", line 247, in place_order
group_id=orderer.group_id,
File "/home/alexis/copanier/copanier/emails.py", line 50, in send_order
group_id=group_id,
File "/home/alexis/copanier/copanier/emails.py", line 37, in send_from_template
send(to, subject, body=txt, html=html)
File "/home/alexis/copanier/copanier/emails.py", line 19, in send
return print("Sending email", str(body))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u20ac' in position 162: ordinal not in range(256)

Enhance the readme

  • Is a configuration file needed?
  • Is there a database?
  • how to deploy this (wsgi / reverse HTTP proxy) ?

Rethink how products and producers are handled

Currently, they're part of the delivery, but we might want to put them in a separate location, like it's done for groups, so that we don't have to copy them on every delivery.

If we do this, we might want to enable / disable them on a delivery basis.
Also, when we do this, we might want to keep a record of the prices and availability of the products, related to a delivery, but I'm not sure how we should handle this.

Ideas?

Unmatched ''"' when when decoding 'string'

I have a bug on a fresh install when I try to login. This is when using python 3.8.2.

Traceback (most recent call last):
  File "/workspace/.pip-modules/lib/python3.8/site-packages/roll/__init__.py", line 60, in __call__
    await handler(request, response, **request.route.vars)
  File "/workspace/copanier/copanier/views/login.py", line 38, in connexion
    response.html("login.html")
  File "/workspace/copanier/copanier/views/core.py", line 29, in html
    self.body = self.render_template(template_name, *args, **kwargs)
  File "/workspace/copanier/copanier/views/core.py", line 23, in render_template
    context["message"] = json.loads(self.request.cookies["message"])
ValueError: Unmatched ''"' when when decoding 'string'

Permit to disable to edit groups for non-admin user

Right now a non-admin can modify a group and edit the name and the list of members.
That's very much error prone for a newcomer.

If that's useful for some organisations, we should be able to disable from the config the access to that functionality.

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.