diff --git a/flaschengeist/plugins/schedule/__init__.py b/flaschengeist/plugins/schedule/__init__.py index 218bd53..075775b 100644 --- a/flaschengeist/plugins/schedule/__init__.py +++ b/flaschengeist/plugins/schedule/__init__.py @@ -3,31 +3,21 @@ from datetime import datetime, timedelta from flask import Blueprint, request, jsonify from werkzeug.exceptions import BadRequest, NotFound -from flaschengeist.plugins import Plugin from flaschengeist.database import db -from flaschengeist.models.event import EventKind +from flaschengeist.plugins import Plugin from flaschengeist.decorator import login_required -from flaschengeist.controller import eventController + +from .models import EventKind +from . import event_controller, permissions schedule_bp = Blueprint("schedule", __name__, url_prefix="/schedule") -_permission_edit_type = "schedule_edit_type" -_permission_edit = "schedule_edit" -_permission_create = "schedule_create" -_permission_delete = "schedule_delete" -_permission_assign = "schedule_assign_other" class SchedulePlugin(Plugin): def __init__(self, config): super().__init__( blueprint=schedule_bp, - permissions=[ - _permission_create, - _permission_edit, - _permission_edit_type, - _permission_delete, - _permission_assign, - ], + permissions=permissions.permissions, ) @@ -56,7 +46,7 @@ class SchedulePlugin(Plugin): @schedule_bp.route("/events/", methods=["GET"]) @login_required() def __get_event(eid, **kwargs): - event = eventController.get_event(eid) + event = event_controller.get_event(eid) if not event: raise NotFound return jsonify(event) @@ -91,7 +81,7 @@ def __get_events(year=datetime.now().year, month=datetime.now().month, day=None, else: end = datetime(year=year, month=month + 1, day=1) - events = eventController.get_events(begin, end) + events = event_controller.get_events(begin, end) return jsonify(events) except ValueError: raise BadRequest("Invalid date given") @@ -103,7 +93,7 @@ def __new_event_kind(**kwargs): data = request.get_json() if "name" not in data: raise BadRequest - kind = eventController.create_event_kind(data["name"]) + kind = event_controller.create_event_kind(data["name"]) return jsonify({"ok": "ok", "id": kind.id}) @@ -113,7 +103,7 @@ def __new_slot_kind(**kwargs): data = request.get_json() if not data or "name" not in data: raise BadRequest - kind = eventController.create_job_kind(data["name"]) + kind = event_controller.create_job_kind(data["name"]) return jsonify({"ok": "ok", "id": kind.id}) @@ -121,7 +111,7 @@ def __new_slot_kind(**kwargs): @login_required(permission=_permission_create) def __new_event(**kwargs): data = request.get_json() - event = eventController.create_event( + event = event_controller.create_event( begin=parser.isoparse(data["begin"]), end=parser.isoparse(data["end"]), description=data["description"], @@ -133,7 +123,7 @@ def __new_event(**kwargs): @schedule_bp.route("/events/", methods=["DELETE"]) @login_required(permission=_permission_delete) def __delete_event(event_id, **kwargs): - if not eventController.delete_event(event_id): + if not event_controller.delete_event(event_id): raise NotFound db.session.commit() return jsonify({"ok": "ok"}) @@ -145,14 +135,14 @@ def __edit_event_kind(event_id, **kwargs): data = request.get_json() if not data or "name" not in data: raise BadRequest - eventController.rename_event_kind(event_id, data["name"]) + event_controller.rename_event_kind(event_id, data["name"]) return jsonify({"ok": "ok"}) @schedule_bp.route("/events//slots", methods=["GET"]) @login_required() def __get_slots(event_id, **kwargs): - event = eventController.get_event(event_id) + event = event_controller.get_event(event_id) if not event: raise NotFound return jsonify({event.slots}) @@ -161,7 +151,7 @@ def __get_slots(event_id, **kwargs): @schedule_bp.route("/events//slots/", methods=["GET"]) @login_required() def __get_slot(event_id, slot_id, **kwargs): - slot = eventController.get_event_slot(slot_id, event_id) + slot = event_controller.get_event_slot(slot_id, event_id) if slot: return jsonify(slot) raise NotFound @@ -170,7 +160,7 @@ def __get_slot(event_id, slot_id, **kwargs): @schedule_bp.route("/events//slots/", methods=["DELETE"]) @login_required(permission=_permission_delete) def __delete_slot(event_id, slot_id, **kwargs): - if eventController.delete_event_slot(slot_id, event_id): + if event_controller.delete_event_slot(slot_id, event_id): return jsonify({"ok": "ok"}) raise NotFound @@ -183,8 +173,8 @@ def __update_slot(event_id, slot_id, **kwargs): raise BadRequest for job in data["jobs"]: - eventController.add_job(job.kind, job.user) - if eventController.delete_event_slot(slot_id, event_id): + event_controller.add_job(job.kind, job.user) + if event_controller.delete_event_slot(slot_id, event_id): return jsonify({"ok": "ok"}) raise NotFound @@ -192,7 +182,7 @@ def __update_slot(event_id, slot_id, **kwargs): @schedule_bp.route("/events//slots", methods=["POST"]) @login_required(permission=_permission_edit) def __add_slot(event_id, **kwargs): - event = eventController.get_event(event_id) + event = event_controller.get_event(event_id) if not event: raise NotFound data = request.get_json() @@ -206,7 +196,7 @@ def __add_slot(event_id, **kwargs): attr["job_slots"].append({"needed_persons": job["needed_persons"], "kind": job["kind"]}) except KeyError: raise BadRequest("Missing data in request") - eventController.add_slot(event, **attr) + event_controller.add_slot(event, **attr) return jsonify({"ok": "ok"}) diff --git a/flaschengeist/controller/eventController.py b/flaschengeist/plugins/schedule/event_controller.py similarity index 96% rename from flaschengeist/controller/eventController.py rename to flaschengeist/plugins/schedule/event_controller.py index 4e0b6b5..c8faf8b 100644 --- a/flaschengeist/controller/eventController.py +++ b/flaschengeist/plugins/schedule/event_controller.py @@ -3,7 +3,7 @@ from sqlalchemy.exc import IntegrityError from flaschengeist import logger from flaschengeist.database import db -from flaschengeist.models.event import EventKind, Event, EventSlot, JobSlot, JobKind +from flaschengeist.plugins.schedule.models import EventKind, Event, EventSlot, JobSlot, JobKind def get_event(id): diff --git a/flaschengeist/models/event.py b/flaschengeist/plugins/schedule/models.py similarity index 96% rename from flaschengeist/models/event.py rename to flaschengeist/plugins/schedule/models.py index 6e433f1..26d2988 100644 --- a/flaschengeist/models/event.py +++ b/flaschengeist/plugins/schedule/models.py @@ -1,8 +1,8 @@ from datetime import datetime from typing import Optional -from . import ModelSerializeMixin -from .user import User +from flaschengeist.models import ModelSerializeMixin +from flaschengeist.models.user import User from flaschengeist.database import db diff --git a/flaschengeist/plugins/schedule/permissions.py b/flaschengeist/plugins/schedule/permissions.py new file mode 100644 index 0000000..b73873a --- /dev/null +++ b/flaschengeist/plugins/schedule/permissions.py @@ -0,0 +1,19 @@ +CREATE = "schedule_create" +"""Can create events""" + +EDIT = "schedule_edit" +"""Can edit events""" + +DELETE = "schedule_delete" +"""Can delete events""" + +EVENT_TYPE = "schedule_event_type" +"""Can create and edit EventTypes""" + +ASSIGN = "schedule_assign" +"""Can self assign to jobs""" + +ASSIGN_OTHER = "schedule_assign_other" +"""Can assign other users to jobs""" + +permissions = [value for key, value in globals().items() if not key.startswith("_")]