Metadata-Version: 2.4
Name: foreninglet-data
Version: 0.5.2
Summary: A way to retrieve information about members from the ForeningLet API (www.foreninglet.dk) - ForeningLet is a member system for small (typically) voluntary organizations in Denmark
Author-email: Carsten Skov <carsten@simcax.dk>
License-Expression: GPL-3.0-or-later
Requires-Python: >=3.11
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: dataclasses-json<0.7.0,>=0.5.7
Requires-Dist: requests>=2.31.0
Requires-Dist: pandas>=2.1.4
Requires-Dist: loguru>=0.7.2
Requires-Dist: pydantic>=2.6.4
Requires-Dist: retry>=0.9.2
Requires-Dist: dagger-io>=0.19.8
Provides-Extra: dev
Requires-Dist: black>=23.7.0; extra == "dev"
Requires-Dist: python-dotenv==1.2.1; extra == "dev"
Requires-Dist: dagger-io>=0.19.8; extra == "dev"
Requires-Dist: faker<41.0,>=19.2; extra == "dev"
Requires-Dist: typer<0.22,>=0.9; extra == "dev"
Requires-Dist: sphinx>=7.2.6; extra == "dev"
Requires-Dist: pytest-cov<8.0,>=4.1; extra == "dev"
Requires-Dist: pytest>=8.0.0; extra == "dev"
Requires-Dist: pytest-vcr>=1.0.2; extra == "dev"
Requires-Dist: matplotlib>=3.10.8; extra == "dev"
Dynamic: license-file

# foreninglet-data
Python module for generalising access to the ForeningLet (www.foreninglet.dk) member system API

# Current functionality
The project is work in progress. As of now, calling the ForeningLet API has been generalised, and the memberlist can be retrieved. 

A memberlist object can be genereated, and so far has functionality to count the members, and genders. 

# Installation
For now this code can be pip installed by referring to the get repo:

```bash
python -m pip install git+https://github.com/simcax/foreninglet-data
```

# Compulsory Settings
Export settings as environment variables:

```bash
API_USERNAME=username
API_PASSWORD=password
API_BASE_URL=https://foreninglet.dk/api/
API_VERSION=version=1
API_MEMBERS_API=members
API_ACTIVITIES_API=activities
API_RESIGNED_MEMBERS_API=members/status/resigned
MEMBERSHIP_KEYWORDS=keyword1,keyword2 
```
> The `MEMBERSHIP_KEYWORDS` environment variable is needed to correctly match a membership to a member. I.e. consider having the following memberships:
>- 3 måneders medlemskab
>- 6 måneders medlemskab
>- 9 måneders medlemskab
>
> Then giving an environment variable this way: `MEMBERSHIP_KEYWORDS=medlemskab` will get the membership activity IDs from the activity API, and assign the correct membership to each member in the membership list object:
```python
>>> memberlist_obj.memberlist[0].get('Membership')
>>> '3 måneders medlemskab'
```




# Usage
Then import:

```python
from foreninglet_data.api import ForeningLet
from foreninglet_data.memberlist import Memberlist
```

And get the memberlist:

```python
fl_obj = ForeningLet()
memberlist = fl_obj.get_memberlist()
memberlist_obj = Memberlist(memberlist)
```
This will give you a Python memberlist object. The memberlist object contains all the information from the members API call,
now accessible as an object:
```python
memberlist_obj.members 
```
gives you a dictionary with all the members in it. 
In addition the object also holds the data as a Pandas Dataframe:

```python
memberlist_obj.memberlist_dataframe
```
This will enable further data manipulation and investigation into the data returned.

> This has not been tested with HUGE organisations, only up till about 1200 members. There could be some limitations on memory consumption. (Hence the sub 1.0 release ;-) )




Retrieve the membercount:

```python
# All members
memberlist.member_count
# All the GenuineMembers
memberlist.genuine_member_count
# The number of new members in the current month
memberlist.new_members_current_month
memberlist.new_members_current_month_percentage
# The number of new members in the previous month
memberlist.new_members_previous_month
memberlist.new_members_previous_month_percentage
# Number of members joined last year
memberlist.members_last_year
# Number of members joined current year
memberlist.members_current_year
# Members enrolled per year
memberlist.members_per_year 
- Returns a dictionary with year as key and number of enrolled members as values:
  {'2020': 14, '2021': 15, '2022': 15, '2023': 10}
```

Retrieve the count of genders:

```python
memberlist.count_men
memberlist.count_women
```

Getting a list of member ages 
```python
memberlist.member_age_list
```
This is a dict with a full range of each age from the youngest to the eldest member. 
In the case no members are of a given age, the dict will contain the age but a count of 0.

The dict is sorted by age.

i.e:
```python
{23: 1, 24: 0, 25: 0, 26: 0, 27: 0, 28: 0, 29: 0, 30: 1, 31: 0, 32: 0, 33: 0, 34: 0, 35: 0, 36: 0, ...}
```

