86 lines
3.1 KiB
Python
86 lines
3.1 KiB
Python
"""Balance plugin
|
|
|
|
Extends users plugin with balance functions
|
|
"""
|
|
|
|
from flask import current_app
|
|
from werkzeug.local import LocalProxy
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
from flaschengeist import logger
|
|
from flaschengeist.plugins import Plugin, plugins_loaded, before_update_user
|
|
from flaschengeist.plugins.scheduler import add_scheduled
|
|
|
|
from . import permissions, models
|
|
|
|
|
|
def service_debit():
|
|
from flaschengeist.database import db
|
|
from flaschengeist.models import UtcDateTime
|
|
from flaschengeist.models.user import User
|
|
from flaschengeist.controller import roleController
|
|
from flaschengeist_events.models import Service, Job
|
|
|
|
role = BalancePlugin.plugin.get_setting("service_role", default=None)
|
|
if role is None:
|
|
try:
|
|
role = roleController.get("__has_service")
|
|
except NotFound:
|
|
role = roleController.create_role("__has_service", [permissions.DEBIT])
|
|
BalancePlugin.plugin.set_setting("service_role", role.id)
|
|
else:
|
|
role = roleController.get(role)
|
|
|
|
active_services = (
|
|
User.query.join(Service, User.id_ == Service._user_id)
|
|
.join(Job, Service.job_)
|
|
.filter(Job.start <= UtcDateTime.current_utc(), Job.end.is_(None) | (Job.end >= UtcDateTime.current_utc()))
|
|
.distinct(User.id_)
|
|
.all()
|
|
)
|
|
previous_services = BalancePlugin.plugin.get_setting("service_debit", default=[])
|
|
|
|
logger.debug(f"Found {len(active_services)} users doing their service.")
|
|
|
|
if len(previous_services) > 0:
|
|
previous_services = User.query.filter(User.userid.in_(previous_services)).all()
|
|
# Remove not active users
|
|
for user in [u for u in previous_services if u not in active_services]:
|
|
user.roles_ = [r for r in user.roles_ if r.id != role.id]
|
|
# Add active
|
|
for user in [u for u in active_services if u not in previous_services]:
|
|
if role not in user.roles_:
|
|
user.roles_.append(role)
|
|
db.session.commit()
|
|
BalancePlugin.plugin.set_setting("service_debit", [u.userid for u in active_services])
|
|
|
|
|
|
class BalancePlugin(Plugin):
|
|
permissions = permissions.permissions
|
|
models = models
|
|
migrations = True
|
|
|
|
plugin: "BalancePlugin" = LocalProxy(lambda: current_app.config["FG_PLUGINS"][BalancePlugin.name])
|
|
|
|
def __init__(self, entry_point, config):
|
|
super(BalancePlugin, self).__init__(entry_point, config)
|
|
from .routes import blueprint
|
|
|
|
self.blueprint = blueprint
|
|
|
|
@plugins_loaded
|
|
def post_loaded(*args, **kwargs):
|
|
if config.get("allow_service_debit", False) and "events" in current_app.config["FG_PLUGINS"]:
|
|
add_scheduled(f"{id}.service_debit", service_debit, minutes=1)
|
|
|
|
@before_update_user
|
|
def set_default_limit(user):
|
|
from . import balance_controller
|
|
|
|
try:
|
|
limit = self.get_setting("limit")
|
|
logger.debug("Setting default limit of {} to user {}".format(limit, user.userid))
|
|
balance_controller.set_limit(user, limit, override=False)
|
|
except KeyError:
|
|
pass
|