A tool to manage a Framadate
Project description
framadatectl
This python program offers both a Python API and a shell command allowing you to:
- read data from a Framadate (via its public link)
- manage a Framadate (via its admin link)
Framadate is a service from Framasoft (https://framadate.org) but it can also be self-hosted.
Installation
From PyPI
pip install framadatectl
From sources
git clone https://gitlab.com/albinou/python-framadatectl.git
cd python-framadatectl
pip install .
Use framadatectl without installation
git clone https://gitlab.com/albinou/python-framadatectl.git
cd python-framadatectl/src
python -m framadatectl [arguments]
Command line
Basic usage
Here are a few examples of command line usage. URL
is to be replaced with a
valid Framadate link. It can either be:
- a public link of the form https://framadate.org/IDENTIFIER
- an admin link of the form https://framadate.org/ADMIN_IDENTIFIER/admin
Examples:
- Display all poll results, i.e. all date slots:
shell> framadatectl --url=URL show all-slots
2021-09-01: [Bob, Alice, John] (3 vote(s))
2021-09-08: [Bob, Alice] (2 vote(s))
2021-09-15: [John] (1 vote(s))
- Display the next date slot (let's consider today date is 2021-09-05):
shell> framadatectl --url=URL show next-slot
2021-09-08: [Bob, Alice] (2 vote(s))
- Check if at least 3 people voted for the next date slot:
shell> framadatectl --url=URL --min-votes=3 check next-slot
2021-09-08: KO (1 missing vote(s))
- Check if at least 3 people voted for the date slot "2021-09-01":
shell> framadatectl --url=URL --min-votes=3 check vote 2021-09-01
2021-09-01: OK (3 vote(s))
- Add a new date slot for 2021-09-22:
shell> framadatectl --url=URL add slot 2021-09-22
2021-09-22: added
- Delete old date slots (let's consider today date is 2021-09-05):
shell> framadatectl --url=URL delete old-slots
2021-09-01: deleted
- Much more commands and sub-commands can be found in the usage:
shell> framadatectl --help
usage: __main__.py [-h] [-c CONFIG] [--url URL] [--min-votes MIN_VOTES] [--max-votes MAX_VOTES] [--quiet] [-v]
{show,check,add,delete,job} ...
A tool to manage a Framadate
optional arguments:
-h, --help show this help message and exit
-c CONFIG, --config CONFIG
Path to a config file
--url URL Full Framadate URL (admin or public)
--min-votes MIN_VOTES
Minimum number of required votes (used by check commands)
--max-votes MAX_VOTES
Maximum number of required votes (used by check commands)
--quiet Make the output less verbose
-v, --version show program's version number and exit
commands:
{show,check,add,delete,job}
show Show poll results
check Check poll results
add Add new date slots
delete Delete date slots
job Run a job from a config file
Using a configuration file
Having to specify the URL, the min-votes and max-votes values on the command can be cumbersome. Here is where the configuration comes in!
The configuration can be passed to framadatectl
thanks to the --config
option. The configuration file follows the
YAML syntax.
Here a basic config.yaml
file example:
configuration:
url: https://framadate.org/IDENTIFIER
constraints:
votes:
min: 3
max: 3
moment_regexp: '^(?P<nb>\d+) people$'
Note that url
is the only required field.
Beware to keep the space indentation.
Running jobs
Overview
Jobs can defined in the configuration and then run like this:
framadatectl --config=config.yaml job JOB_NAME
The syntax for defining jobs has been highly inspired by the
Home Assistant project.
Here is an example of job named JOB_ID
:
job:
- id: JOB_ID
condition:
- condition: CONDITION_1
# arguments for the condition rule
- condition: CONDITION_2
# arguments for the condition rule
[...]
action:
- action: ACTION_1
# arguments for the action rule
- action: ACTION_2
# arguments for the action rule
Calling framadatectl --config=config.yaml job JOB_ID
will run ACTION_1
and
ACTION_2
if both CONDITION_1
and CONDITION_2
are true.
Definitions of supported conditions and actions are available below.
Conditions
Conditions are optional and allows to run a job only if all conditions are met. Here is a list of supported conditions.
slots
The slots
condition allows to verify conditions on a set of slots.
This condition requires 2 arguments:
slots
: filter the date slotsverify
: condition to check on the filtered slots
verify
can specify:
votes
/less
ormore
: number of expected votesconstraints
: a boolean specifying whether the check of config constraints must return True or False
For example, the following slots
condition is met if the next date slot has
less than 3 participants and more than 2 participants.
job:
- id: JOB_NAME
condition:
- condition: slots
slots: next-slot
verify:
votes:
less: 3
more: 2
action:
- action: ACTION
This other condition example checks whether the config constraints are met.
job:
- id: JOB_NAME
condition:
- condition: slots
slots: next-slot
verify:
constraints: True
action:
- action: ACTION
It could be used to warn people that there is not enough people for this date.
Actions
command
This command
action can be used to run commands that are usually run from a
shell.
This action requires 2 arguments:
command
: a command likeshow
,check
,add
ordelete
subcommand
: the subcommand of the given command
For example, the following command
action deletes all old date slots.
job:
- id: JOB_NAME
action:
- action: command
command: delete
subcommand: old-slots
backup
The backup
action allows to backup some votes.
This action requires 2 arguments :
slots
: filter the date slots to backupmode
: file mode ('w' for truncating the file, 'a' for appending)filepath
: location of the backup file
For example, the following backup
action appends the outdated votes to the
backup.txt file.
action:
- action: backup
slots: old-slots
mode: a
filepath: /PATH/TO/backup.txt
Output file will have the following format (one information per line, allowing the file to be easily parsed with grep or sed):
# 2021-09-01
Bob
Alice
John
The email
action allows to send an email.
This action requires 2 arguments:
slot
: date slot whose data can be used in the email contentcontent
: Email content
For example, the following email
action sends an email to dest@example.org
with details on the next comming date slot:
job:
- id: JOB_NAME
action:
- action: email
slot: next-slot
content: |
From: me@example.org
To: dest@example.org
Content-Type: text/plain; charset=utf-8
Content-Language: fr-FR
Subject: Information on date slot {date:%A %d %B}
Hello,
There is {nb_votes} for {date:%A %d %B}.
This command requires to add the smtp server into your configuration:
configuration:
url: https://framadate.org/IDENTIFIER
email:
smtp_host: smtp.example.com
smtp_port: 465 # default value is 25
smtp_security: SSL # valid values are SSL, STARTTLS
smtp_user: bob
smtp_password: Alice
Note that smtp_port
, smtp_security
, smtp_user
and smtp_password
options are optional (can be useful if your SMTP server does not require any authentication and/or does not use any security mode).
Library
This python package provides a Framadate class that you can instantiate.
Here is an example below:
from datetime import date
from framadatectl import framadate
framadate = framadate.Framadate(config.get_url())
votes = framadate.get_votes(date(2021, 9, 1))
for v in votes:
print(v.get_name())
Take a look at the source code for more details.
How does this work?
This programs works by:
- fetching a Framadate CSV file with the poll results
- running some well formated HTTP GET or POST requests
- parsing the HTML page in order to get some advanced operations URLs (with the Python Beautiful Soup library)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file framadatectl-0.3.6.tar.gz
.
File metadata
- Download URL: framadatectl-0.3.6.tar.gz
- Upload date:
- Size: 30.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.1 CPython/3.10.8
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 44ae6b02bab4ee595c2bf48adc053060466d5f218009f22df19fb31258b95373 |
|
MD5 | 438a1b6022e0e1d5a5fbb97402285e99 |
|
BLAKE2b-256 | 78094f85a0d942356ceff9ff59b2265ab8b24ec56dfda6681a6ccf62d87a6022 |