Compare commits

..

59 Commits

Author SHA1 Message Date
c4f5979d95 added model and migration for resume 2024-08-30 19:13:43 +02:00
92f5393a4c added nullable false to prevent unexpected migration of this table 2024-08-30 19:11:03 +02:00
383ef8b512 initial (empty) blueprint and model 2024-08-30 19:11:03 +02:00
033dee7836 Merge pull request 'Update dependency python-dotenv to v0.21.1' (!91) from renovate/python-dotenv-0.x into main
Reviewed-on: kompetenzinventar/ki-backend#91
2024-08-28 16:27:46 +02:00
ca81e8bf70 Merge branch 'main' into renovate/python-dotenv-0.x 2024-08-28 16:02:01 +02:00
d507a20a93 Merge pull request 'Update dependency flake8 to v6' (!107) from renovate/flake8-6.x into main
Reviewed-on: kompetenzinventar/ki-backend#107
2024-08-28 15:52:02 +02:00
3f2c23c386 Merge branch 'main' into renovate/flake8-6.x 2024-08-28 15:46:31 +02:00
b46ac5e379 Merge pull request 'Update dependency pymysql to v1.1.1' (!90) from renovate/pymysql-1.x into main
Reviewed-on: kompetenzinventar/ki-backend#90
2024-08-28 15:43:17 +02:00
fa4429b6ef Update dependency flake8 to v6 2024-08-28 13:37:17 +00:00
7a0f2434db Update dependency python-dotenv to v0.21.1 2024-08-28 13:36:27 +00:00
8c3fe3fe7d Update dependency pymysql to v1.1.1 2024-08-28 13:36:11 +00:00
56ade6de68 Merge pull request 'Update dependency flask to v2.3.3' (!87) from renovate/flask-2.x into main
Reviewed-on: kompetenzinventar/ki-backend#87
Reviewed-by: Brain <brain@noreply.git.wtf-eg.de>
2024-08-28 15:19:36 +02:00
28cf714217 Update dependency flask to v2.3.3 2024-08-28 12:35:38 +00:00
9ff56f6676 Merge pull request 'Update dependency yapf to v0.40.2' (!94) from renovate/yapf-0.x into main
Reviewed-on: kompetenzinventar/ki-backend#94
2024-08-28 13:46:17 +02:00
2412df4960 Apply yapf and add ignorefile 2024-08-28 13:43:33 +02:00
469ef511d6 Merge pull request 'Add .python-version file' (!105) from pyenv into main
Reviewed-on: kompetenzinventar/ki-backend#105
2024-08-28 13:19:28 +02:00
47d2c94b79 Specify license for .python-version 2024-08-28 12:57:31 +02:00
384dd82454 Update dependency yapf to v0.40.2 2024-08-27 17:38:01 +00:00
b0dcfacd25 Add .python-version file 2024-08-27 19:08:52 +02:00
86edb246bf Merge pull request 'revert f02efab07aeabe02a94efd62fbe498659297b36f' (!102) from revert-python-3.11 into main
Reviewed-on: kompetenzinventar/ki-backend#102
2024-08-23 15:59:55 +02:00
9424e21edc revert f02efab07a
revert Merge pull request 'Update python Docker tag to v3.11.9' (!97) from renovate/minor-3.11-python into main

Reviewed-on: kompetenzinventar/ki-backend#97
2024-08-23 15:50:30 +02:00
f02efab07a Merge pull request 'Update python Docker tag to v3.11.9' (!97) from renovate/minor-3.11-python into main
Reviewed-on: kompetenzinventar/ki-backend#97
2024-08-23 15:33:32 +02:00
08f1104942 Merge branch 'main' into renovate/minor-3.11-python 2024-08-23 15:30:29 +02:00
8dde142f38 Try and use Python 3.11 2024-08-23 15:26:39 +02:00
d1b1636aa2 Merge pull request 'Update dependency waitress to v2.1.2' (!93) from renovate/waitress-2.x into main
Reviewed-on: kompetenzinventar/ki-backend#93
2024-08-23 12:01:59 +02:00
3fcd1fa20e Update python Docker tag to v3.11.9 2024-08-22 18:37:13 +00:00
8394400e96 Update dependency waitress to v2.1.2 2024-08-22 18:36:55 +00:00
843050f923 Merge pull request 'Update plugins/docker Docker tag to v20.18.4' (!95) from renovate/plugins-docker-20.x into main
Reviewed-on: kompetenzinventar/ki-backend#95
2024-08-22 19:53:59 +02:00
812913ffe2 Merge pull request 'Update dependency reuse to v0.14.0' (!92) from renovate/reuse-0.x into main
Reviewed-on: kompetenzinventar/ki-backend#92
2024-08-22 19:52:24 +02:00
dee80c7e14 Update plugins/docker Docker tag to v20.18.4 2024-08-22 15:35:49 +00:00
de60ec0d46 Update dependency reuse to v0.14.0 2024-08-22 14:35:41 +00:00
6c6fcea81c Merge pull request 'Update python Docker tag to v3.8.19' (!85) from renovate/patch-python into main
Reviewed-on: kompetenzinventar/ki-backend#85
2024-08-22 13:17:55 +02:00
166e0d40c6 Merge pull request 'Update dependency werkzeug to v2.3.8' (!84) from renovate/werkzeug-2.x into main
Reviewed-on: kompetenzinventar/ki-backend#84
2024-08-22 12:39:36 +02:00
c9b5ab62ed Update python Docker tag to v3.8.19 2024-08-22 10:35:35 +00:00
c0005100b4 Update dependency werkzeug to v2.3.8 2024-08-22 10:35:34 +00:00
d614039cdd Merge pull request 'Pin python Docker tag to 0ef73cd' (!83) from renovate/python into main
Reviewed-on: kompetenzinventar/ki-backend#83
2024-08-22 11:52:25 +02:00
316236a7e5 Merge pull request 'Pin dependencies' (!82) from renovate/pin-dependencies into main
Reviewed-on: kompetenzinventar/ki-backend#82
2024-08-22 11:51:54 +02:00
c15faabd6d Pinning werkzeug to v2
Thanks for the hint in #78
2024-08-22 11:46:27 +02:00
53eab74e60 Pin python Docker tag to 0ef73cd 2024-08-22 09:35:43 +00:00
82d908193c Pin dependencies 2024-08-22 09:35:42 +00:00
6620a6819a Merge pull request 'Configure Renovate' (!81) from renovate/configure into main
Reviewed-on: kompetenzinventar/ki-backend#81
2024-08-22 11:25:28 +02:00
be6fec18ab Update Renovate config 2024-08-21 22:12:27 +02:00
9ebae03550 Add renovate.json 2024-08-21 19:34:54 +00:00
763a6efc9f Merge pull request 'Improve Docker usage' (!80) from docker-improvements into main
Reviewed-on: kompetenzinventar/ki-backend#80
2024-08-21 21:22:40 +02:00
6f04d23e6c Add license information to .dockerignore file 2024-08-21 21:17:33 +02:00
155ddc556c Add .dockerignore file 2024-08-21 21:09:12 +02:00
a5a85e6032 Fix Dockerfile warnings 2024-08-21 21:08:52 +02:00
6a3458a596 Pin Docker images in CI 2024-08-21 20:53:59 +02:00
97be8f4667 Ditch builder and base Docker images
This should make dependency upgrades easier and bring more clarity to the CI pipelines
2024-08-21 20:49:47 +02:00
776803fc96 Merge pull request 'Add catalan flag' (!77) from HerHde/ki-backend:add-ca-flag into main
Reviewed-on: kompetenzinventar/ki-backend#77

> Anything else to consider?

I didn't know myself, but it was interesting to find out. No, this should work as soon as deployed. Catalan already exists in the language DB, and the existance of ca.svg is already tested whenever a catalan icon is requested.
2023-12-10 19:08:48 +01:00
702f4968f6 Merge pull request 'Use Gitea registry' (!76) from gitea-registry into main
Reviewed-on: kompetenzinventar/ki-backend#76
2023-12-10 18:46:35 +01:00
c1285153ef Add catalan flag 2023-12-09 21:36:24 +01:00
fdc81844b5 Push image to Gitea registry 2023-12-04 19:51:27 +01:00
b804c22a93 Use Gitea registry for base images 2023-12-04 19:45:08 +01:00
9a7a9379e2 Merge pull request 'Add labels to Docker images' (!75) from docker-labels into main
Reviewed-on: kompetenzinventar/ki-backend#75
2023-11-16 11:18:00 +01:00
5b707ad294 Merge pull request 'Rewrite Drone config' (!74) from drone-config into main
Reviewed-on: kompetenzinventar/ki-backend#74
2023-11-16 11:17:35 +01:00
68bf505cd0 Merge install, lint and test steps 2023-11-06 23:30:54 +01:00
2ac03d0c26 Merge install, lint and test steps
Probably necessary because of the virtualenv
2023-11-06 23:20:44 +01:00
6b46ea5516 Rewrite Drone config
- Split PR and push to main actions
- Deploy latest main to dev system
- Build image for Git tags
2023-11-06 23:15:58 +01:00
24 changed files with 902 additions and 582 deletions

13
.dockerignore Normal file
View File

@ -0,0 +1,13 @@
# SPDX-FileCopyrightText: WTF Kooperative eG <https://wtf-eg.de/>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
*
!Pipfile
!Pipfile.lock
!data/
!ki/
!LICENSES/
!migrations/
!app.py
!run_prod.py

View File

@ -4,48 +4,114 @@
# SPDX-License-Identifier: AGPL-3.0-or-later
kind: pipeline
type: docker
name: default
name: qa
trigger:
event:
- push
- pull_request
branch:
- main
steps:
- name: qa
image: registry.wtf-eg.net/ki-backend-builder:1.0.0
- name: install-lint-test
image: python:3.8.19-alpine@sha256:3bd7ea88cb637e09d6c7de24c5394657163a85c2be82bfebe0305cf07f8de1ea
env:
PYROOT: '/pyroot'
PYTHONUSERBASE: '/pyroot'
commands:
- apk add --no-cache gcc g++ musl-dev python3-dev
- pip3 install pipenv
- pipenv install --dev
- pipenv run flake8
- pipenv run reuse lint
- pipenv run python -m unittest discover ki
- name: docker-publish
image: plugins/docker
settings:
registry: registry.wtf-eg.net
repo: registry.wtf-eg.net/ki-backend
target: ki-backend
auto_tag: true
username:
from_secret: "docker_username"
password:
from_secret: "docker_password"
when:
---
kind: pipeline
type: docker
name: build
trigger:
event:
- push
branch:
- main
- name: docker-publish-tag
image: plugins/docker
depends_on:
- qa
steps:
- name: docker-publish
image: plugins/docker:20.18.4@sha256:a8d3d86853c721492213264815f1d00d3ed13f42f5c1855a02f47fa4d5f1e042
settings:
registry: registry.wtf-eg.net
repo: registry.wtf-eg.net/ki-backend
registry: git.wtf-eg.de
repo: git.wtf-eg.de/kompetenzinventar/backend
target: ki-backend
auto_tag: true
username:
from_secret: "docker_username"
password:
from_secret: "docker_password"
when:
---
kind: pipeline
type: docker
name: deploy
trigger:
event:
- push
branch:
- main
depends_on:
- build
steps:
- name: deploy-dev
image: appleboy/drone-ssh:1.7.5@sha256:995677e073454912f26d4c0fdd2f9df2e1f5a30d6603d3f2ece667311b6babb3
settings:
host:
- dev01.wtf-eg.net
username: drone_deployment
key:
from_secret: "dev01_deployment_key"
command_timeout: 2m
script:
- echo "Executing forced command..."
---
kind: pipeline
type: docker
name: tag-release
trigger:
event:
- tag
image_pull_secrets:
- dockerconfig
steps:
- name: install-lint-test
image: python:3.8.19-alpine@sha256:3bd7ea88cb637e09d6c7de24c5394657163a85c2be82bfebe0305cf07f8de1ea
env:
PYROOT: '/pyroot'
PYTHONUSERBASE: '/pyroot'
commands:
- apk add --no-cache gcc g++ musl-dev python3-dev
- pip3 install pipenv
- pipenv install --dev
- pipenv run flake8
- pipenv run reuse lint
- pipenv run python -m unittest discover ki
- name: docker-publish
image: plugins/docker:20.18.4@sha256:a8d3d86853c721492213264815f1d00d3ed13f42f5c1855a02f47fa4d5f1e042
settings:
registry: git.wtf-eg.de
repo: git.wtf-eg.de/kompetenzinventar/backend
target: ki-backend
auto_tag: true
username:
from_secret: "docker_username"
password:
from_secret: "docker_password"

View File

@ -27,5 +27,5 @@ repos:
name: reuse
entry: reuse lint
language: system
exclude: .*
exclude: ^(venv).*$
always_run: true

1
.python-version Normal file
View File

@ -0,0 +1 @@
3.8.19

View File

@ -10,3 +10,7 @@ License: MIT
Files: Pipfile.lock migrations/*
Copyright: WTF Kooperative eG <https://wtf-eg.de/>
License: AGPL-3.0-or-later
Files: renovate.json .python-version
Copyright: WTF Kooperative eG <https://wtf-eg.de/>
License: AGPL-3.0-or-later

5
.yapfignore Normal file
View File

@ -0,0 +1,5 @@
# SPDX-FileCopyrightText: WTF Kooperative eG <https://wtf-eg.de/>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
migrations/*.py

View File

@ -2,7 +2,17 @@
#
# SPDX-License-Identifier: AGPL-3.0-or-later
FROM registry.wtf-eg.net/ki-backend-builder:1.0.1 as builder
FROM python:3.8.19-alpine@sha256:3bd7ea88cb637e09d6c7de24c5394657163a85c2be82bfebe0305cf07f8de1ea AS builder
ENV PYROOT=/pyroot
ENV PYTHONUSERBASE=$PYROOT
RUN apk add --no-cache \
gcc \
g++ \
musl-dev \
python3-dev && \
pip3 install pipenv
COPY Pipfile* ./
@ -10,7 +20,10 @@ RUN PIP_USER=1 PIP_IGNORE_INSTALLED=1 pipenv install --system --deploy --ignore-
RUN pip3 uninstall --yes pipenv
FROM registry.wtf-eg.net/ki-backend-base:1.0.1 as ki-backend
FROM python:3.8.19-alpine@sha256:3bd7ea88cb637e09d6c7de24c5394657163a85c2be82bfebe0305cf07f8de1ea AS ki-backend
ENV PYROOT=/pyroot
ENV PYTHONUSERBASE=$PYROOT
# Install six explicitly. Otherwise Python complains about it missing.
RUN pip3 install six

29
Pipfile
View File

@ -8,22 +8,23 @@ verify_ssl = true
name = "pypi"
[packages]
flask = "~=2.0.1"
python-dotenv = "~=0.17.1"
flask-migrate = "~=3.0.1"
flask-sqlalchemy = "~=2.5.1"
sqlalchemy = "~=1.4.18"
waitress = "~=2.0.0"
pyyaml = "~=6.0.1"
flask-cors = "~=3.0.10"
ldap3 = "~=2.9"
pymysql = "~=1.0.2"
flask = "==2.3.3"
python-dotenv = "==0.21.1"
flask-migrate = "==3.0.1"
flask-sqlalchemy = "==2.5.1"
sqlalchemy = "==1.4.53"
waitress = "==2.1.2"
pyyaml = "==6.0.2"
flask-cors = "==3.0.10"
ldap3 = "==2.9.1"
pymysql = "==1.1.1"
werkzeug = "==2.3.8"
[dev-packages]
flake8 = "~=3.9.2"
yapf = "~=0.31.0"
pre-commit = "~=2.13.0"
reuse = "~=0.13.0"
flake8 = "==6.1.0"
yapf = "==0.40.2"
pre-commit = "==2.13.0"
reuse = "==0.14.0"
[requires]
python_version = "3.8"

1060
Pipfile.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -222,25 +222,6 @@ docker-compose up
Dann http://localhost:13337 aufrufen.
### Workaround, falls der Zugriff auf registry.wtf-eg.net nicht möglich ist
Voraussetzung:
[ki-backend-docker](https://git.wtf-eg.de/kompetenzinventar/ki-backend-docker) muss parallel zum `ki-backend` ausgecheckt sein.
```
cd ki-backend-docker
docker build . --target base -t ki-backend-base
docker build . --target builder -t ki-backend-builder
```
Ändern der 2 Einträge im `Dockerfile` des `ki-backend`:
- registry.wtf-eg.net/ki-backend-builder:1.0.0 -> ki-backend-builder
- registry.wtf-eg.net/ki-backend-base:1.0.0 -> ki-backend-base
Danach sollte `docker-compose up` funktionieren.
## Lizenzen
Dieses Projekt erfüllt die [REUSE](https://reuse.software/) Spezifikation.

5
app.py
View File

@ -42,5 +42,8 @@ db = SQLAlchemy(app)
migrate = Migrate(app, db, compare_type=True)
app.logger.info("Hello from KI")
from ki import module # noqa
from ki import resume
app.register_blueprint(resume.bp_resume, url_prefix='/resume')

5
data/imgs/flags/ca.svg Normal file
View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" width="810" height="540">
<rect width="810" height="540" fill="#FCDD09"/>
<path stroke="#DA121A" stroke-width="60" d="M0,90H810m0,120H0m0,120H810m0,120H0"/>
</svg>

After

Width:  |  Height:  |  Size: 242 B

View File

@ -33,7 +33,7 @@ class Profile(db.Model):
volunteerwork = Column(String(4000), default="")
freetext = Column(String(4000), default="")
availability_status = Column(Boolean, default=False)
availability_status = Column(Boolean, default=False, nullable=False)
availability_text = Column(String(4000), default="")
availability_hours_per_week = Column(Integer, default=0)

32
ki/resume.py Normal file
View File

@ -0,0 +1,32 @@
# SPDX-FileCopyrightText: WTF Kooperative eG <https://wtf-eg.de/>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from flask import Blueprint
from ki.token_auth import token_auth
from ki.resume_models import Resume
bp_resume = Blueprint('resume', __name__,
template_folder='templates')
@bp_resume.route('/')
@token_auth
def show(page):
"""
return the list of resumes as object with data array inside
"""
pass
@bp_resume.route("/<resume_id>")
@token_auth
def get_resume(resume_id):
"""
lookup for resume with resume_id, check if its from this user
and provide its contents in the appropriate format
shall support 'format' parameter with values of 'html', 'pdf'
if no parameter is given, json is returned
"""
r = Resume()
return r.to_dict()

28
ki/resume_models.py Normal file
View File

@ -0,0 +1,28 @@
# SPDX-FileCopyrightText: WTF Kooperative eG <https://wtf-eg.de/>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from sqlalchemy import Column, Integer, String, ForeignKey, JSON
from sqlalchemy.orm import relationship
from app import db
class Resume(db.Model):
__tablename__ = 'resume'
id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("user.id", ondelete='CASCADE'))
label = Column("label", String(50), nullable=True)
data = Column('data', JSON)
user = relationship("User", backref='user', passive_deletes=True)
def to_dict(self):
return {
"id": self.id,
'user_id': self.user_id,
"label": self.label,
"data": self.data
}

View File

@ -4,41 +4,18 @@
import os
from flask import g, make_response, request, send_file
from functools import wraps
from ki.auth import auth
from ki.handlers import find_profiles as find_profiles_handler
from ki.handlers import update_profile as update_profile_handler
from ki.models import ContactType, Language, Skill, Token, User
from ki.models import ContactType, Language, Skill, User
from app import app
from ki.token_auth import token_auth
content_type_svg = "image/svg+xml"
content_type_png = "image/png"
def token_auth(func):
@wraps(func)
def _token_auth(*args, **kwargs):
auth_header = request.headers.get("Authorization")
if (auth_header is None):
return make_response({}, 401)
if not auth_header.startswith("Bearer"):
return make_response({}, 401)
token = Token.query.filter(Token.token == auth_header[7:]).first()
if token is None:
return make_response({}, 403)
g.user = token.user
return func(*args, **kwargs)
return _token_auth
def models_to_list(models):
models_list = []

View File

@ -8,6 +8,7 @@ from ki.test.ApiTest import ApiTest
class TestContactTypesEndpoint(ApiTest):
def test_skills_options(self):
response = self.client.options("/contacttypes")
self.assertEqual(response.status_code, 200)

View File

@ -8,6 +8,7 @@ from ki.test.ApiTest import ApiTest
class TestFindProfilesEndpoint(ApiTest):
def test_find_profiles_options(self):
response = self.client.options("/users/profiles")
self.assertEqual(response.status_code, 200)

View File

@ -8,6 +8,7 @@ from ki.test.ApiTest import ApiTest
class TestLanguagesEndpoint(ApiTest):
def test_skills_options(self):
response = self.client.options("/languages")
self.assertEqual(response.status_code, 200)

View File

@ -10,6 +10,7 @@ from ki.test.ApiTest import ApiTest
class TestLoginEndpoint(ApiTest):
def test_login(self):
response1_data = self.login("peter", "geheim")
response2_data = self.login("peter", "geheim")

View File

@ -8,6 +8,7 @@ from ki.test.ApiTest import ApiTest
class TestSkillsEndpoint(ApiTest):
def test_skills_options(self):
response = self.client.options("/skills")
self.assertEqual(response.status_code, 200)

31
ki/token_auth.py Normal file
View File

@ -0,0 +1,31 @@
# SPDX-FileCopyrightText: WTF Kooperative eG <https://wtf-eg.de/>
#
# SPDX-License-Identifier: AGPL-3.0-or-later
from flask import g, make_response, request
from functools import wraps
from ki.models import Token
def token_auth(func):
@wraps(func)
def _token_auth(*args, **kwargs):
auth_header = request.headers.get("Authorization")
if (auth_header is None):
return make_response({}, 401)
if not auth_header.startswith("Bearer"):
return make_response({}, 401)
token = Token.query.filter(Token.token == auth_header[7:]).first()
if token is None:
return make_response({}, 403)
g.user = token.user
return func(*args, **kwargs)
return _token_auth

View File

@ -0,0 +1,35 @@
"""add resume
Revision ID: 6be5073423b4
Revises: b5023977cbda
Create Date: 2024-08-30 18:18:14.555874
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = '6be5073423b4'
down_revision = 'b5023977cbda'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('resume',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('user_id', sa.Integer(), nullable=True),
sa.Column('label', sa.String(length=50), nullable=True),
sa.Column('data', sa.JSON(), nullable=True),
sa.ForeignKeyConstraint(['user_id'], ['user.id'], ondelete='CASCADE'),
sa.PrimaryKeyConstraint('id')
)
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table('resume')
# ### end Alembic commands ###

18
renovate.json Normal file
View File

@ -0,0 +1,18 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:best-practices",
":disableDependencyDashboard",
":maintainLockFilesMonthly",
":pinVersions",
":separateMultipleMajorReleases"
],
"packageRules": [
{
"matchDepNames": ["python"],
"groupName": "Python",
"separateMinorPatch": true,
"separateMultipleMinor": true
}
]
}