feat: add personal ics feeds for assigned tasks
This commit is contained in:
@@ -3,9 +3,11 @@ from __future__ import annotations
|
||||
from functools import lru_cache
|
||||
from pathlib import Path
|
||||
|
||||
from flask import Blueprint, current_app, redirect, send_from_directory, url_for
|
||||
from flask import Blueprint, Response, current_app, redirect, send_from_directory, url_for
|
||||
from flask_login import current_user
|
||||
|
||||
from ..models import User
|
||||
from ..services.calendar_feeds import build_calendar_feed
|
||||
|
||||
bp = Blueprint("main", __name__)
|
||||
|
||||
@@ -39,6 +41,16 @@ def uploads(filename: str):
|
||||
return send_from_directory(current_app.config["UPLOAD_FOLDER"], filename)
|
||||
|
||||
|
||||
@bp.route("/calendar-feed/<token>.ics")
|
||||
def calendar_feed(token: str):
|
||||
user = User.query.filter_by(calendar_feed_token=token).first_or_404()
|
||||
body = build_calendar_feed(user, url_for("tasks.my_tasks", _external=True))
|
||||
response = Response(body, content_type="text/calendar; charset=utf-8")
|
||||
response.headers["Content-Disposition"] = 'inline; filename="putzliga.ics"'
|
||||
response.headers["Cache-Control"] = "private, max-age=300"
|
||||
return response
|
||||
|
||||
|
||||
@lru_cache(maxsize=64)
|
||||
def load_icon_svg(name: str, static_folder: str) -> str:
|
||||
path = Path(static_folder) / "icons" / f"{name}.svg"
|
||||
|
||||
@@ -45,6 +45,7 @@ def _save_avatar(file_storage) -> str:
|
||||
@bp.route("", methods=["GET", "POST"])
|
||||
@login_required
|
||||
def index():
|
||||
current_user.ensure_calendar_feed_token()
|
||||
form = SettingsProfileForm(original_email=current_user.email, obj=current_user)
|
||||
admin_form = AdminUserForm(prefix="admin")
|
||||
quick_task_config_form = QuickTaskConfigForm(prefix="quickconfig")
|
||||
@@ -80,6 +81,7 @@ def index():
|
||||
quick_task_config=quick_task_config,
|
||||
users=User.query.order_by(User.is_admin.desc(), User.name.asc()).all(),
|
||||
earned_badges=earned_badges_for_user(current_user.id),
|
||||
calendar_feed_url=url_for("main.calendar_feed", token=current_user.calendar_feed_token, _external=True),
|
||||
push_ready=push_enabled(),
|
||||
has_subscription=bool(subscriptions),
|
||||
settings_tabs=_settings_tabs(),
|
||||
@@ -87,6 +89,16 @@ def index():
|
||||
)
|
||||
|
||||
|
||||
@bp.route("/calendar-feed/regenerate", methods=["POST"])
|
||||
@login_required
|
||||
def regenerate_calendar_feed():
|
||||
current_user.calendar_feed_token = None
|
||||
current_user.ensure_calendar_feed_token()
|
||||
db.session.commit()
|
||||
flash("Dein persönlicher Kalender-Link wurde neu erzeugt.", "success")
|
||||
return redirect(url_for("settings.index"))
|
||||
|
||||
|
||||
@bp.route("/badges")
|
||||
@login_required
|
||||
def badges():
|
||||
|
||||
Reference in New Issue
Block a user