Remove warnings #441

This commit is contained in:
Daniel Grams 2023-04-19 15:32:30 +02:00
parent 9b70a1fd63
commit 84882971b6
107 changed files with 59280 additions and 326 deletions

1603
.dcignore Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
describe("Event", () => {
[{ recurrence: false }, { recurrence: true }].forEach(function (test) {
it.only("creates event with recurrence=" + test.recurrence, () => {
it("creates event with recurrence=" + test.recurrence, () => {
cy.login();
cy.createAdminUnit().then(function (adminUnitId) {
cy.visit("/admin_unit/" + adminUnitId + "/events/create");
@ -48,7 +48,7 @@ describe("Event", () => {
});
});
it.only("saves draft", () => {
it("saves draft", () => {
cy.login();
cy.createAdminUnit().then(function (adminUnitId) {
cy.visit("/admin_unit/" + adminUnitId + "/events/create");

View File

@ -57,7 +57,7 @@ flask db upgrade
## i18n
<https://pythonhosted.org/Flask-BabelEx/>
<https://python-babel.github.io/flask-babel/>
### Init

View File

@ -0,0 +1,73 @@
"""empty message
Revision ID: 30650020b4b7
Revises: 421660a4a792
Create Date: 2023-04-18 23:52:37.520530
"""
import sqlalchemy as sa
import sqlalchemy_utils
from alembic import op
from sqlalchemy.dialects import postgresql
from project import dbtypes
# revision identifiers, used by Alembic.
revision = "30650020b4b7"
down_revision = "421660a4a792"
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("user", schema=None) as batch_op:
batch_op.drop_column("current_login_at")
batch_op.drop_column("current_login_ip")
batch_op.drop_column("last_login_at")
batch_op.drop_column("login_count")
batch_op.drop_column("last_login_ip")
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
with op.batch_alter_table("user", schema=None) as batch_op:
batch_op.add_column(
sa.Column(
"last_login_ip",
sa.VARCHAR(length=100),
autoincrement=False,
nullable=True,
)
)
batch_op.add_column(
sa.Column("login_count", sa.INTEGER(), autoincrement=False, nullable=True)
)
batch_op.add_column(
sa.Column(
"last_login_at",
postgresql.TIMESTAMP(),
autoincrement=False,
nullable=True,
)
)
batch_op.add_column(
sa.Column(
"current_login_ip",
sa.VARCHAR(length=100),
autoincrement=False,
nullable=True,
)
)
batch_op.add_column(
sa.Column(
"current_login_at",
postgresql.TIMESTAMP(),
autoincrement=False,
nullable=True,
)
)
# ### end Alembic commands ###

View File

@ -3,7 +3,7 @@ import os
from datetime import timedelta
from flask import Flask
from flask_babelex import Babel
from flask_babel import Babel
from flask_cors import CORS
from flask_gzip import Gzip
from flask_mail import Mail, email_dispatched
@ -36,7 +36,6 @@ app.config["REDIS_URL"] = os.getenv("REDIS_URL")
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
app.config["SECURITY_CONFIRMABLE"] = True
app.config["SECURITY_POST_LOGIN_VIEW"] = "manage_after_login"
app.config["SECURITY_TRACKABLE"] = True
app.config["SECURITY_REGISTERABLE"] = True
app.config["SECURITY_SEND_REGISTER_EMAIL"] = True
app.config["SECURITY_RECOVERABLE"] = True
@ -62,6 +61,9 @@ app.config["FLASK_DEBUG"] = getenv_bool("FLASK_DEBUG", "False")
if os.getenv("PREFERRED_URL_SCHEME"): # pragma: no cover
app.config["PREFERRED_URL_SCHEME"] = os.getenv("PREFERRED_URL_SCHEME")
if app.config["PREFERRED_URL_SCHEME"] == "https":
app.config["SESSION_COOKIE_SECURE"] = True
from project.reverse_proxied import ReverseProxied
app.wsgi_app = ReverseProxied(app.wsgi_app)
@ -134,9 +136,11 @@ sitemap_path = os.path.join(cache_path, sitemap_file)
robots_txt_path = os.path.join(cache_path, robots_txt_file)
# i18n
from project.i10n import get_locale
app.config["BABEL_DEFAULT_LOCALE"] = "de"
app.config["BABEL_DEFAULT_TIMEZONE"] = "Europe/Berlin"
babel = Babel(app)
babel = Babel(app, locale_selector=get_locale)
# cors
cors = CORS(
@ -188,9 +192,9 @@ from project.api import RestApi
QRcode(app)
# JSON
from project.jsonld import DateTimeEncoder
from project.jsonld import CustomJsonProvider
app.json_encoder = DateTimeEncoder
app.json_provider_class = CustomJsonProvider
from project.forms.security import ExtendedConfirmRegisterForm, ExtendedLoginForm
@ -228,7 +232,7 @@ if getenv_bool("TESTING"): # pragma: no cover
app.config["SECURITY_EMAIL_VALIDATOR_ARGS"] = {"check_deliverability": False}
import project.cli.user
from project import i10n, init_data, jinja_filters, requests
from project import init_data, jinja_filters, requests
# Routes
from project.views import (

View File

@ -3,7 +3,7 @@ from apispec.exceptions import DuplicateComponentNameError
from apispec.ext.marshmallow import MarshmallowPlugin
from flask import url_for
from flask_apispec.extension import FlaskApiSpec
from flask_babelex import gettext
from flask_babel import gettext
from flask_marshmallow import Marshmallow
from flask_restful import Api
from marshmallow import ValidationError

View File

@ -1,6 +1,6 @@
from flask import abort, request
from flask_apispec import doc, marshal_with, use_kwargs
from flask_babelex import gettext
from flask_babel import gettext
from sqlalchemy import and_
from project import db
@ -198,6 +198,7 @@ class OrganizationEventImportResource(BaseResource):
importer = EventImporter(admin_unit.id)
with db.session.no_autoflush:
# deepcode ignore Ssrf: url sanitized in importer
event = importer.load_event_from_url(import_request["url"])
except Exception:
abort(422)

View File

@ -445,8 +445,8 @@ def create_event_suggestion(admin_unit_id, freetext):
def _add_event_to_list(event_list_id, event_id):
event = Event.query.get(event_id)
event_list = EventList.query.get(event_list_id)
event = db.session.get(Event, event_id)
event_list = db.session.get(EventList, event_list_id)
event_list.events.append(event)
db.session.commit()

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import BooleanField, RadioField, StringField, SubmitField, TextAreaField
from wtforms.fields import EmailField

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import DecimalField, FormField, StringField, SubmitField, TextAreaField
from wtforms.fields import BooleanField, EmailField, TelField, URLField

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import SubmitField
from wtforms.fields import EmailField

View File

@ -1,5 +1,5 @@
from flask import url_for
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from markupsafe import Markup
from wtforms import HiddenField, StringField

View File

@ -1,6 +1,6 @@
from dateutil.relativedelta import relativedelta
from flask import request
from flask_babelex import gettext, lazy_gettext
from flask_babel import gettext, lazy_gettext
from flask_wtf import FlaskForm
from wtforms import (
BooleanField,

View File

@ -1,5 +1,5 @@
from flask import request
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import HiddenField, SelectField, StringField, SubmitField
from wtforms.validators import Optional

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import DecimalField, FormField, StringField, SubmitField, TextAreaField
from wtforms.fields import URLField

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import (
BooleanField,

View File

@ -1,6 +1,6 @@
import os
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import SubmitField

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import DecimalField, FormField, StringField, SubmitField
from wtforms.fields import EmailField, TelField, URLField

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import HiddenField, SelectField, SubmitField
from wtforms.validators import Optional

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import SelectField, SubmitField
from wtforms.validators import DataRequired

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import SelectField, StringField, SubmitField
from wtforms.fields import BooleanField

View File

@ -1,4 +1,4 @@
from flask_babelex import gettext, lazy_gettext
from flask_babel import gettext, lazy_gettext
from flask_security import url_for_security
from flask_security.forms import (
ConfirmRegisterForm,

View File

@ -1,4 +1,4 @@
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from flask_wtf import FlaskForm
from wtforms import BooleanField, SubmitField
from wtforms.validators import Optional

View File

@ -1,6 +1,6 @@
from datetime import datetime
from flask_babelex import gettext, to_user_timezone
from flask_babel import gettext, to_user_timezone
from markupsafe import Markup
from wtforms import DateTimeField, SelectField, SelectMultipleField
from wtforms.fields import StringField

View File

@ -1,11 +1,13 @@
from flask import request
from flask_babelex import gettext
from flask_babel import gettext
from project import app, babel
from project import app
@babel.localeselector
def get_locale():
if not request:
return app.config["LANGUAGES"][0]
return request.accept_languages.best_match(app.config["LANGUAGES"])

View File

@ -44,7 +44,7 @@ app.jinja_env.filters["is_list"] = is_list
app.jinja_env.filters["any_dict_value_true"] = any_dict_value_true
app.jinja_env.filters["ensure_link_scheme"] = lambda s: ensure_link_scheme(s)
app.jinja_env.filters["place_str"] = lambda p: get_place_str(p)
app.jinja_env.filters["location_str"] = lambda l: get_location_str(l)
app.jinja_env.filters["location_str"] = lambda location: get_location_str(location)
def get_base_url():

View File

@ -1,21 +1,24 @@
import datetime
from json import JSONEncoder
from flask import url_for
from flask.json.provider import DefaultJSONProvider
from project.dateutils import berlin_tz
from project.jinja_filters import url_for_image
from project.models import EventAttendanceMode, EventStatus
class DateTimeEncoder(JSONEncoder):
# Override the default method
def default(self, obj):
class CustomJsonProvider(DefaultJSONProvider):
@staticmethod
def default(obj):
if isinstance(obj, datetime.datetime):
return (obj.astimezone(berlin_tz)).isoformat()
elif isinstance(obj, datetime.date):
return obj.isoformat()
# pragma: no cover
return super(CustomJsonProvider, CustomJsonProvider).default(obj)
def get_sd_for_admin_unit(admin_unit):
result = {}

View File

@ -38,4 +38,4 @@ from project.models.legacy import (
from project.models.location import Location
from project.models.oauth import OAuth2AuthorizationCode, OAuth2Client, OAuth2Token
from project.models.settings import Settings
from project.models.user import Role, User, UserFavoriteEvents
from project.models.user import OAuth, Role, User, UserFavoriteEvents

View File

@ -40,11 +40,6 @@ class User(db.Model, UserMixin):
email = Column(String(255), unique=True)
username = Column(String(255))
password = Column(String(255))
last_login_at = Column(DateTime())
current_login_at = Column(DateTime())
last_login_ip = Column(String(100))
current_login_ip = Column(String(100))
login_count = Column(Integer)
active = Column(Boolean())
fs_uniquifier = Column(String(255))
confirmed_at = Column(DateTime())

View File

@ -68,7 +68,7 @@ class AuthorizationCodeGrant(grants.AuthorizationCodeGrant):
db.session.commit()
def authenticate_user(self, authorization_code):
return User.query.get(authorization_code.user_id)
return db.session.get(User, authorization_code.user_id)
class OpenIDCode(_OpenIDCode):
@ -97,7 +97,7 @@ class RefreshTokenGrant(grants.RefreshTokenGrant):
return token
def authenticate_user(self, credential):
return User.query.get(credential.user_id)
return db.session.get(User, credential.user_id)
def revoke_old_credential(self, credential):
credential.revoked = True

View File

@ -1,6 +1,6 @@
from datetime import datetime, timedelta
from flask import g
from flask import g, request
from flask_login.utils import encode_cookie
from project import app
@ -16,6 +16,21 @@ def set_manage_admin_unit_cookie(response):
"manage_admin_unit_id",
value=encoded,
expires=datetime.utcnow() + timedelta(days=365),
secure=app.config["SESSION_COOKIE_SECURE"],
)
return response
@app.after_request
def set_response_headers(response):
if request and request.endpoint:
if request.endpoint != "static" and request.endpoint != "widget_event_dates":
response.headers["X-Frame-Options"] = "SAMEORIGIN"
response.headers["X-Content-Type-Options"] = "nosniff"
response.headers["Referrer-Policy"] = "no-referrer"
response.headers[
"Content-Security-Policy"
] = "default-src 'self'; script-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self' data: *.openstreetmap.org;"
return response

View File

@ -5,7 +5,7 @@ import shutil
from sqlalchemy import and_
from sqlalchemy.orm import joinedload
from project import app, dump_path
from project import app, db, dump_path
from project.api.event.schemas import EventDumpSchema
from project.api.event_category.schemas import EventCategoryDumpSchema
from project.api.event_reference.schemas import EventReferenceDumpSchema
@ -163,7 +163,7 @@ class AdminUnitDumper(Dumper): # pragma: no cover
self.dump_image(organizer.logo)
# Organizations
organization = AdminUnit.query.get(self.admin_unit_id)
organization = db.session.get(AdminUnit, self.admin_unit_id)
self.dump_item(organization, OrganizationDumpSchema(), "organization")
self.dump_image(organization.logo)

View File

@ -4,7 +4,7 @@ from datetime import datetime
import icalendar
from dateutil.relativedelta import relativedelta
from flask import url_for
from flask_babelex import format_date, format_time, gettext
from flask_babel import format_date, format_time, gettext
from icalendar.prop import vDDDLists
from sqlalchemy import and_, case, func, or_
from sqlalchemy.orm import (

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

10965
project/static/ext/jquery-3.6.4.js vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1035,7 +1035,7 @@
for (d = 0; d < conf.weekdays.length; d++) {
day = conf.weekdays[d];
input = field.find('input[name=riweeklyweekdays' + day + ']');
input.attr('checked', $.inArray(day, byday) !== -1);
input.prop('checked', $.inArray(day, byday) !== -1);
}
break;
@ -1077,7 +1077,7 @@
selectors = field.find('input[name=rimonthlytype]');
for (index = 0; index < selectors.length; index++) {
radiobutton = selectors[index];
$(radiobutton).attr('checked', radiobutton.value === monthlyType);
$(radiobutton).prop('checked', radiobutton.value === monthlyType);
}
break;
@ -1120,7 +1120,7 @@
selectors = field.find('input[name=riyearlyType]');
for (index = 0; index < selectors.length; index++) {
radiobutton = selectors[index];
$(radiobutton).attr('checked', radiobutton.value === yearlyType);
$(radiobutton).prop('checked', radiobutton.value === yearlyType);
}
break;
@ -1145,7 +1145,7 @@
selectors = field.find('input[name=rirangetype]');
for (index = 0; index < selectors.length; index++) {
radiobutton = selectors[index];
$(radiobutton).attr('checked', radiobutton.value === rangeType);
$(radiobutton).prop('checked', radiobutton.value === rangeType);
}
break;
}

View File

@ -3,8 +3,8 @@
<head>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no, minimal-ui">
<link rel="stylesheet" type="text/css" href="/static/widget/calendar.css">
<link href="https://cdn.jsdelivr.net/npm/@mdi/font@6.5.95/css/materialdesignicons.min.css" rel="stylesheet">
<link href="https://cdn.jsdelivr.net/npm/vuetify@2.6.2/dist/vuetify.min.css" rel="stylesheet">
<link href="/static/ext/materialdesignicons.6.5.95.min.css" rel="stylesheet">
<link href="/static/ext/vuetify.2.6.2.min.css" rel="stylesheet">
<style>
[v-cloak] {
display: none;
@ -90,10 +90,10 @@
</template>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
<script src="https://cdn.jsdelivr.net/npm/vuetify@2.6.2/dist/vuetify.js"></script>
<script src="https://unpkg.com/axios@0.21.1/dist/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js" integrity="sha256-AdQN98MVZs44Eq2yTwtoKufhnU+uZ7v2kXnD5vqzZVo=" crossorigin="anonymous"></script>
<script src="/static/ext/vue.2.6.14.js"></script>
<script src="/static/ext/vuetify.2.6.2.js"></script>
<script src="/static/ext/axios.0.21.1.min.js"></script>
<script src="/static/ext/moment.2.24.0.with-locales.min.js"></script>
<script>
axios.defaults.baseURL = window.location.origin;
moment.locale("de");
@ -268,6 +268,6 @@ Vue.component('event-warning-pills', {
}
}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.2/iframeResizer.contentWindow.min.js" integrity="sha512-14SY6teTzhrLWeL55Q4uCyxr6GQOxF3pEoMxo2mBxXwPRikdMtzKMYWy2B5Lqjr6PHHoGOxZgPaxUYKQrSmu0A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="/static/ext/iframeResizer.4.3.2.contentWindow.min.js"></script>
</body>
</html>

View File

@ -5,20 +5,20 @@
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Event calendar widget</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<link type="text/css" rel="stylesheet" href="https://unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.min.css" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.1/css/all.min.css">
<link rel="stylesheet" href="/static/ext/bootstrap.4.6.2.min.css">
<link type="text/css" rel="stylesheet" href="/static/ext/bootstrap-vue.2.21.2.min.css" />
<link rel="stylesheet" href="/static/ext/font-awesome.5.13.1/css/all.min.css">
<style>
[v-cloak] {
display: none;
}
</style>
<script src="https://unpkg.com/vue@2.6.14/dist/vue.js"></script>
<script src="https://unpkg.com/vue-i18n@8.25.0/dist/vue-i18n.min.js"></script>
<script src="https://unpkg.com/axios@0.21.1/dist/axios.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js" integrity="sha256-AdQN98MVZs44Eq2yTwtoKufhnU+uZ7v2kXnD5vqzZVo=" crossorigin="anonymous"></script>
<script src="https://unpkg.com/bootstrap-vue@2.21.2/dist/bootstrap-vue.min.js"></script>
<script src="/static/ext/vue.2.6.14.min.js"></script>
<script src="/static/ext/vue-i18n.8.25.0.min.js"></script>
<script src="/static/ext/axios.0.21.1.min.js"></script>
<script src="/static/ext/moment.2.24.0.with-locales.min.js"></script>
<script src="/static/ext/bootstrap-vue.2.21.2.min.js"></script>
</head>
<body>
<div id="app" v-cloak>
@ -527,6 +527,6 @@ window.iFrameResizer = {
}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.2/iframeResizer.contentWindow.min.js" integrity="sha512-14SY6teTzhrLWeL55Q4uCyxr6GQOxF3pEoMxo2mBxXwPRikdMtzKMYWy2B5Lqjr6PHHoGOxZgPaxUYKQrSmu0A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="/static/ext/iframeResizer.4.3.2.contentWindow.min.js"></script>
</body>
</html>

View File

@ -19,7 +19,6 @@
<th>{{ _('Email') }}</th>
<th>created_at</th>
<th>confirmed_at</th>
<th>current_login_at</th>
<th></th>
</tr>
</thead>
@ -29,7 +28,6 @@
<td>{{ user.email }}</td>
<td>{% if user.created_at %}{{ user.created_at | dateformat }}{% endif %}</td>
<td>{% if user.confirmed_at %}{{ user.confirmed_at | dateformat }}{% endif %}</td>
<td>{% if user.current_login_at %}{{ user.current_login_at | dateformat }}{% endif %}</td>
<td>
<a href="{{ url_for('admin_user_update', id=user.id) }}">{{ _('Edit') }}</a>
<a href="{{ url_for('admin_user_delete', id=user.id) }}">{{ _('Delete') }}</a>

View File

@ -43,14 +43,19 @@
<link rel="icon" type="image/png" sizes="16x16" href="{{ url_for('static', filename='apple-touch-icon.png')}}">
<link rel="manifest" href="{{ url_for('static', filename='site.webmanifest')}}">
<link rel="stylesheet" href="{{ url_for('static', filename='ext/bootstrap.4.4.1.min.css')}}">
<link rel="stylesheet" href="{{ url_for('static', filename='ext/bootstrap.4.6.2.min.css')}}">
<link rel="stylesheet" href="{{ url_for('static', filename='ext/font-awesome.5.13.1/css/all.min.css')}}">
<link rel="stylesheet" type="text/css" href="{{ url_for('static', filename='site.css')}}" />
{%- block styles %}
{%- endblock styles %}
<script src="{{ url_for('static', filename='ext/jquery-1.12.4.min.js')}}"></script>
{% if False | env_override('FLASK_DEBUG') %}
<script src="{{ url_for('static', filename='ext/jquery-3.6.4.js')}}"></script>
{% else %}
<script src="{{ url_for('static', filename='ext/jquery-3.6.4.min.js')}}"></script>
{% endif %}
<script src="{{ url_for('static', filename='ext/moment.2.24.0.with-locales.min.js')}}"></script>
{% block header_before_site_js %}
@ -319,7 +324,7 @@
</div>
<script src="{{ url_for('static', filename='ext/popper.1.16.0.min.js')}}"></script>
<script src="{{ url_for('static', filename='ext/bootstrap.4.4.1.min.js')}}"></script>
<script src="{{ url_for('static', filename='ext/bootstrap.4.6.2.min.js')}}"></script>
{% block scripts %}
{%- endblock scripts %}
{%- endblock body %}

View File

@ -1,7 +1,7 @@
import os
import pathlib
from flask_babelex import lazy_gettext
from flask_babel import lazy_gettext
from psycopg2.errorcodes import CHECK_VIOLATION, UNIQUE_VIOLATION
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm.base import NO_CHANGE, object_state

View File

@ -1,6 +1,6 @@
from celery import group
from flask import flash, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import roles_required
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.sql import func

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,8 +1,7 @@
import json
from datetime import datetime
from flask import Response, flash, jsonify, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError
@ -17,7 +16,7 @@ from project.access import (
)
from project.dateutils import create_icalendar, get_next_full_hour
from project.forms.event import CreateEventForm, DeleteEventForm, UpdateEventForm
from project.jsonld import DateTimeEncoder, get_sd_for_event_date
from project.jsonld import get_sd_for_event_date
from project.models import (
AdminUnit,
Event,
@ -64,9 +63,7 @@ def event(event_id):
structured_datas = list()
for event_date in dates:
structured_data = json.dumps(
get_sd_for_event_date(event_date), indent=2, cls=DateTimeEncoder
)
structured_data = app.json.dumps(get_sd_for_event_date(event_date), indent=2)
structured_datas.append(structured_data)
return render_template(
@ -294,7 +291,7 @@ def get_event_category_choices():
def prepare_event_place(form):
if form.event_place_id.data and form.event_place_id.data > 0:
place = EventPlace.query.get(form.event_place_id.data)
place = db.session.get(EventPlace, form.event_place_id.data)
if place:
form.event_place_id.choices = [(place.id, get_place_str(place))]
@ -305,7 +302,7 @@ def prepare_event_place(form):
def prepare_organizer(form):
if form.organizer_id.data and form.organizer_id.data > 0:
organizer = EventOrganizer.query.get(form.organizer_id.data)
organizer = db.session.get(EventOrganizer, form.organizer_id.data)
if organizer:
form.organizer_id.choices = [(organizer.id, organizer.name)]

View File

@ -1,5 +1,3 @@
import json
from flask import render_template, request, url_for
from flask.wrappers import Response
@ -7,7 +5,7 @@ from project import app
from project.access import can_read_event_or_401
from project.dateutils import create_icalendar
from project.forms.event_date import FindEventDateForm
from project.jsonld import DateTimeEncoder, get_sd_for_event_date
from project.jsonld import get_sd_for_event_date
from project.services.event import (
create_ical_event_for_date,
get_event_date_with_details_or_404,
@ -50,9 +48,7 @@ def event_date(id):
event_date = get_event_date_with_details_or_404(id)
can_read_event_or_401(event_date.event)
structured_data = json.dumps(
get_sd_for_event_date(event_date), indent=2, cls=DateTimeEncoder
)
structured_data = app.json.dumps(get_sd_for_event_date(event_date), indent=2)
url = url_for("event_date", id=id, _external=True)
share_links = get_share_links(url, event_date.event.name)

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -42,7 +42,7 @@ def image(id, hash=None):
# Save from database to disk
make_dir(img_path)
img = get_image_from_bytes(image.data)
img.thumbnail((width, height), PIL.Image.ANTIALIAS)
img.thumbnail((width, height), PIL.Image.Resampling.LANCZOS)
img.save(file_path)
# Load from disk

View File

@ -1,6 +1,6 @@
from flask import request
from flask.json import jsonify
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import url_for_security
from flask_security.utils import localize_callback

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.sql import desc, func

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import current_user, permissions_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import Response, flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,5 +1,5 @@
from flask import abort, flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.sql import desc

View File

@ -1,5 +1,5 @@
from flask import abort, flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.sql import desc

View File

@ -1,5 +1,5 @@
from flask import abort, flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required
from sqlalchemy.exc import SQLAlchemyError

View File

@ -2,7 +2,7 @@ import json
import os.path
from flask import render_template, request, send_from_directory, url_for
from flask_babelex import gettext
from flask_babel import gettext
from markupsafe import Markup
from sqlalchemy import text

View File

@ -1,5 +1,5 @@
from flask import flash, redirect, render_template, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import auth_required, current_user
from sqlalchemy.exc import SQLAlchemyError

View File

@ -1,7 +1,7 @@
from urllib.parse import quote_plus
from flask import Markup, flash, g, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_login.utils import decode_cookie
from flask_mail import Message
from flask_security import current_user

View File

@ -1,7 +1,5 @@
import json
from flask import flash, redirect, render_template, request, url_for
from flask_babelex import gettext
from flask_babel import gettext
from flask_security import current_user
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.sql import func
@ -15,7 +13,7 @@ from project.access import (
from project.dateutils import get_next_full_hour
from project.forms.event_date import FindEventDateForm
from project.forms.event_suggestion import CreateEventSuggestionForm
from project.jsonld import DateTimeEncoder, get_sd_for_event_date
from project.jsonld import get_sd_for_event_date
from project.models import AdminUnit, EventOrganizer, EventReviewStatus, EventSuggestion
from project.services.event import (
get_event_date_with_details_or_404,
@ -75,9 +73,7 @@ def widget_event_date(au_short_name, id):
event_date = get_event_date_with_details_or_404(id)
can_read_event_or_401(event_date.event)
structured_data = json.dumps(
get_sd_for_event_date(event_date), indent=2, cls=DateTimeEncoder
)
structured_data = app.json.dumps(get_sd_for_event_date(event_date), indent=2)
url = url_for("event_date", id=id, _external=True)
share_links = get_share_links(url, event_date.event.name)

5
pytest.ini Executable file
View File

@ -0,0 +1,5 @@
[pytest]
filterwarnings =
ignore
default:::project
ignore::sqlalchemy.exc.LegacyAPIWarning

View File

@ -10,7 +10,7 @@ arrow==1.2.3
async-timeout==4.0.2
attrs==20.3.0
Authlib==1.2.0
Babel==2.9.1
Babel==2.12.1
bcrypt==4.0.1
beautifulsoup4==4.12.2
billiard==3.6.4.0
@ -42,7 +42,7 @@ filelock==3.11.0
flake8==6.0.0
Flask==2.2.3
flask-apispec==0.11.4
Flask-BabelEx==0.9.4
flask-babel==3.1.0
Flask-Bootstrap==3.3.7.1
Flask-Cors==3.0.10
Flask-Dance==6.2.0

View File

@ -8,7 +8,7 @@ def test_read(client, seeder, utils):
assert response.json["settings"]["color"] == "black"
def test_put(client, seeder, utils, app):
def test_put(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
custom_widget_id = seeder.insert_event_custom_widget(admin_unit_id)
@ -19,12 +19,12 @@ def test_put(client, seeder, utils, app):
with app.app_context():
from project.models import CustomWidget
custom_widget = CustomWidget.query.get(custom_widget_id)
custom_widget = db.session.get(CustomWidget, custom_widget_id)
assert custom_widget.name == "Neuer Name"
assert custom_widget.widget_type == "search"
def test_patch(client, seeder, utils, app):
def test_patch(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
custom_widget_id = seeder.insert_event_custom_widget(admin_unit_id)
@ -35,12 +35,12 @@ def test_patch(client, seeder, utils, app):
with app.app_context():
from project.models import CustomWidget
custom_widget = CustomWidget.query.get(custom_widget_id)
custom_widget = db.session.get(CustomWidget, custom_widget_id)
assert custom_widget.name == "Neuer Name"
assert custom_widget.widget_type == "search"
def test_delete(client, seeder, utils, app):
def test_delete(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
custom_widget_id = seeder.insert_event_custom_widget(admin_unit_id)
@ -51,5 +51,5 @@ def test_delete(client, seeder, utils, app):
with app.app_context():
from project.models import CustomWidget
custom_widget = CustomWidget.query.get(custom_widget_id)
custom_widget = db.session.get(CustomWidget, custom_widget_id)
assert custom_widget is None

View File

@ -13,7 +13,7 @@ def test_read(client, app, db, seeder, utils):
from project.models import Event, EventStatus
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.status = EventStatus.scheduled
update_event(event)
@ -180,7 +180,7 @@ def create_put(
@pytest.mark.parametrize(
"variant", ["normal", "legacy", "recurrence", "two_date_definitions"]
)
def test_put(client, seeder, utils, app, mocker, variant):
def test_put(client, seeder, utils, app, db, mocker, variant):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -227,7 +227,7 @@ def test_put(client, seeder, utils, app, mocker, variant):
EventTargetGroupOrigin,
)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.name == "Neuer Name"
assert event.event_place_id == place_id
assert event.organizer_id == organizer_id
@ -353,7 +353,7 @@ def test_put_organizerFromAnotherAdminUnit(client, seeder, utils, app):
utils.assert_response_api_error(response, "Check Violation")
def test_put_co_organizers(client, seeder, utils, app):
def test_put_co_organizers(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -374,7 +374,7 @@ def test_put_co_organizers(client, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.co_organizers) == 2
assert event.co_organizers[0].id == organizer_a_id
assert event.co_organizers[1].id == organizer_b_id
@ -443,7 +443,7 @@ def test_put_durationMoreThanMaxAllowedDuration(client, seeder, utils, app):
utils.assert_response_bad_request(response)
def test_put_categories(client, seeder, utils, app):
def test_put_categories(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -460,11 +460,11 @@ def test_put_categories(client, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.category.name == "Art"
def test_put_dateWithTimezone(client, seeder, utils, app):
def test_put_dateWithTimezone(client, seeder, utils, app, db):
from project.dateutils import create_berlin_date
user_id, admin_unit_id = seeder.setup_api_access()
@ -483,11 +483,11 @@ def test_put_dateWithTimezone(client, seeder, utils, app):
expected = create_berlin_date(2030, 12, 31, 14, 30)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.date_definitions[0].start == expected
def test_put_dateWithoutTimezone(client, seeder, utils, app):
def test_put_dateWithoutTimezone(client, seeder, utils, app, db):
from project.dateutils import create_berlin_date
user_id, admin_unit_id = seeder.setup_api_access()
@ -506,7 +506,7 @@ def test_put_dateWithoutTimezone(client, seeder, utils, app):
expected = create_berlin_date(2030, 12, 31, 14, 30)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.date_definitions[0].start == expected
@ -552,7 +552,7 @@ def test_put_referencedEventNonDirtyUpdate_doesNotSendMail(
mail_mock.assert_not_called()
def test_patch(client, seeder, utils, app):
def test_patch(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
@ -563,12 +563,12 @@ def test_patch(client, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.name == "Name"
assert event.description == "Neu"
def test_patch_startAfterEnd(client, seeder, utils, app):
def test_patch_startAfterEnd(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
@ -601,7 +601,7 @@ def test_patch_referencedEventUpdate_sendsMail(client, seeder, utils, app, mocke
utils.assert_send_mail_called(mail_mock, "other@test.de")
def test_patch_photo(client, seeder, utils, app, requests_mock):
def test_patch_photo(client, seeder, utils, app, db, requests_mock):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
@ -619,7 +619,7 @@ def test_patch_photo(client, seeder, utils, app, requests_mock):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.photo is not None
assert event.photo.encoding_format == "image/png"
@ -640,7 +640,7 @@ def test_patch_photo_copyright(client, db, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.photo.id == image_id
assert event.photo.data is not None
assert event.photo.copyright_text == "Heiner"
@ -662,14 +662,14 @@ def test_patch_photo_delete(client, db, seeder, utils, app):
with app.app_context():
from project.models import Event, Image
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.photo_id is None
image = Image.query.get(image_id)
image = db.session.get(Image, image_id)
assert image is None
def test_delete(client, seeder, utils, app):
def test_delete(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
@ -680,7 +680,7 @@ def test_delete(client, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event is None

View File

@ -102,7 +102,7 @@ def test_search(client, seeder, utils, app, db):
with app.app_context():
from project.models import Event, EventStatus
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.status = EventStatus.cancelled
db.session.commit()

View File

@ -7,7 +7,7 @@ def test_read(client, app, db, seeder, utils):
assert response.json["id"] == event_list_id
def test_put(client, seeder, utils, app):
def test_put(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
event_list_id = seeder.create_event_list(admin_unit_id)
@ -18,11 +18,11 @@ def test_put(client, seeder, utils, app):
with app.app_context():
from project.models import EventList
event_list = EventList.query.get(event_list_id)
event_list = db.session.get(EventList, event_list_id)
assert event_list.name == "Neuer Name"
def test_patch(client, seeder, utils, app):
def test_patch(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
event_list_id = seeder.create_event_list(admin_unit_id)
@ -33,11 +33,11 @@ def test_patch(client, seeder, utils, app):
with app.app_context():
from project.models import EventList
event_list = EventList.query.get(event_list_id)
event_list = db.session.get(EventList, event_list_id)
assert event_list.name == "Neuer Name"
def test_delete(client, seeder, utils, app):
def test_delete(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
event_list_id = seeder.create_event_list(admin_unit_id)
@ -48,7 +48,7 @@ def test_delete(client, seeder, utils, app):
with app.app_context():
from project.models import EventList
event_list = EventList.query.get(event_list_id)
event_list = db.session.get(EventList, event_list_id)
assert event_list is None
@ -63,7 +63,7 @@ def test_events(client, seeder, utils):
assert response.json["items"][0]["id"] == event_id
def test_events_put(client, seeder, utils, app):
def test_events_put(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
event_list_id = seeder.create_event_list(admin_unit_id)
@ -77,12 +77,12 @@ def test_events_put(client, seeder, utils, app):
with app.app_context():
from project.models import EventList
event_list = EventList.query.get(event_list_id)
event_list = db.session.get(EventList, event_list_id)
assert len(event_list.events) == 1
assert event_list.events[0].id == event_id
def test_events_delete(client, seeder, utils, app):
def test_events_delete(client, seeder, utils, app, db):
_, admin_unit_id = seeder.setup_api_access()
event_id = seeder.create_event(admin_unit_id)
event_list_id = seeder.create_event_list(admin_unit_id, event_id)
@ -96,8 +96,8 @@ def test_events_delete(client, seeder, utils, app):
with app.app_context():
from project.models import Event, EventList
event_list = EventList.query.get(event_list_id)
event_list = db.session.get(EventList, event_list_id)
assert len(event_list.events) == 0
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event is not None

View File

@ -215,7 +215,7 @@ def test_events_post(client, seeder, utils, app, variant):
assert len(event.date_definitions) == 1
def test_events_post_co_organizers(client, seeder, utils, app):
def test_events_post_co_organizers(client, seeder, utils, app, db):
url, data, admin_unit_id, place_id, organizer_id = prepare_events_post_data(
seeder, utils
)
@ -233,7 +233,7 @@ def test_events_post_co_organizers(client, seeder, utils, app):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.co_organizers) == 2
assert event.co_organizers[0].id == organizer_a_id
assert event.co_organizers[1].id == organizer_b_id
@ -267,7 +267,7 @@ def test_events_post_photo_too_small(client, seeder, utils, app):
assert error["message"] == "Image is too small (1x1px). At least 320x320px."
def test_events_import(client, seeder, utils, app, shared_datadir):
def test_events_import(client, seeder, utils, app, db, shared_datadir):
external_url = "https://www.harzinfo.de/event/xy"
utils.mock_get_request_with_file(
external_url, shared_datadir, "harzinfo_biathlon.html"
@ -284,7 +284,7 @@ def test_events_import(client, seeder, utils, app, shared_datadir):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert "lädt" in event.description
# 422
@ -459,7 +459,7 @@ def test_outgoing_relation_list_notAuthenticated(client, seeder, utils):
utils.assert_response_unauthorized(response)
def test_outgoing_relation_post(client, app, seeder, utils):
def test_outgoing_relation_post(client, app, seeder, utils, db):
user_id, admin_unit_id = seeder.setup_api_access()
other_user_id = seeder.create_user("other@test.de")
other_admin_unit_id = seeder.create_admin_unit(other_user_id, "Other Crew")
@ -480,7 +480,7 @@ def test_outgoing_relation_post(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitRelation
relation = AdminUnitRelation.query.get(int(response.json["id"]))
relation = db.session.get(AdminUnitRelation, int(response.json["id"]))
assert relation is not None
assert relation.source_admin_unit_id == admin_unit_id
assert relation.target_admin_unit_id == other_admin_unit_id
@ -535,7 +535,7 @@ def test_organization_invitation_list(client, seeder, utils):
assert response.json["items"][0]["organization_name"] == "Invited Organization"
def test_organization_invitation_list_post(client, app, seeder, utils, mocker):
def test_organization_invitation_list_post(client, app, seeder, db, utils, mocker):
mail_mock = utils.mock_send_mails(mocker)
_, admin_unit_id = seeder.setup_api_access()
@ -558,7 +558,7 @@ def test_organization_invitation_list_post(client, app, seeder, utils, mocker):
with app.app_context():
from project.models import AdminUnitInvitation
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is not None
assert invitation.admin_unit_id == admin_unit_id
assert invitation.email == "invited@test.de"

View File

@ -16,7 +16,7 @@ def test_read(client, seeder, utils):
assert response.json["relation_verify"] is False
def test_put(client, app, seeder, utils):
def test_put(client, app, seeder, utils, db):
_, admin_unit_id = seeder.setup_api_access()
invitation_id = seeder.create_admin_unit_invitation(admin_unit_id)
@ -36,7 +36,7 @@ def test_put(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitInvitation
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is not None
assert invitation.admin_unit_id == admin_unit_id
assert invitation.email == "invited@test.de"
@ -45,7 +45,7 @@ def test_put(client, app, seeder, utils):
assert invitation.relation_verify
def test_patch(client, app, seeder, utils):
def test_patch(client, app, seeder, utils, db):
_, admin_unit_id = seeder.setup_api_access()
invitation_id = seeder.create_admin_unit_invitation(admin_unit_id)
@ -63,13 +63,13 @@ def test_patch(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitInvitation
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is not None
assert invitation.admin_unit_id == admin_unit_id
assert invitation.relation_auto_verify_event_reference_requests
def test_delete(client, app, seeder, utils):
def test_delete(client, app, seeder, utils, db):
_, admin_unit_id = seeder.setup_api_access()
invitation_id = seeder.create_admin_unit_invitation(admin_unit_id)
@ -83,5 +83,5 @@ def test_delete(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitInvitation
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is None

View File

@ -47,7 +47,7 @@ def test_put(client, app, seeder, utils, db):
with app.app_context():
from project.models import AdminUnit
admin_unit = AdminUnit.query.get(admin_unit_id)
admin_unit = db.session.get(AdminUnit, admin_unit_id)
admin_unit.can_verify_other = True
db.session.commit()
@ -66,7 +66,7 @@ def test_put(client, app, seeder, utils, db):
with app.app_context():
from project.models import AdminUnitRelation
relation = AdminUnitRelation.query.get(relation_id)
relation = db.session.get(AdminUnitRelation, relation_id)
assert relation is not None
assert relation.source_admin_unit_id == admin_unit_id
assert relation.target_admin_unit_id == other_admin_unit_id
@ -74,7 +74,7 @@ def test_put(client, app, seeder, utils, db):
assert relation.verify
def test_patch(client, app, seeder, utils):
def test_patch(client, app, seeder, utils, db):
user_id, admin_unit_id = seeder.setup_api_access()
(
other_user_id,
@ -96,14 +96,14 @@ def test_patch(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitRelation
relation = AdminUnitRelation.query.get(relation_id)
relation = db.session.get(AdminUnitRelation, relation_id)
assert relation is not None
assert relation.source_admin_unit_id == admin_unit_id
assert relation.target_admin_unit_id == other_admin_unit_id
assert relation.auto_verify_event_reference_requests
def test_delete(client, app, seeder, utils):
def test_delete(client, app, seeder, utils, db):
user_id, admin_unit_id = seeder.setup_api_access()
(
other_user_id,
@ -121,5 +121,5 @@ def test_delete(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitRelation
relation = AdminUnitRelation.query.get(relation_id)
relation = db.session.get(AdminUnitRelation, relation_id)
assert relation is None

View File

@ -6,7 +6,7 @@ def test_read(client, seeder, utils):
utils.get_ok(url)
def test_put(client, seeder, utils, app):
def test_put(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
organizer_id = seeder.upsert_default_event_organizer(admin_unit_id)
@ -17,11 +17,11 @@ def test_put(client, seeder, utils, app):
with app.app_context():
from project.models import EventOrganizer
organizer = EventOrganizer.query.get(organizer_id)
organizer = db.session.get(EventOrganizer, organizer_id)
assert organizer.name == "Neuer Name"
def test_patch(client, seeder, utils, app):
def test_patch(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
organizer_id = seeder.upsert_default_event_organizer(admin_unit_id)
@ -32,12 +32,12 @@ def test_patch(client, seeder, utils, app):
with app.app_context():
from project.models import EventOrganizer
organizer = EventOrganizer.query.get(organizer_id)
organizer = db.session.get(EventOrganizer, organizer_id)
assert organizer.name == "Meine Crew"
assert organizer.phone == "55555"
def test_delete(client, seeder, utils, app):
def test_delete(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
organizer_id = seeder.upsert_default_event_organizer(admin_unit_id)
@ -48,5 +48,5 @@ def test_delete(client, seeder, utils, app):
with app.app_context():
from project.models import EventOrganizer
organizer = EventOrganizer.query.get(organizer_id)
organizer = db.session.get(EventOrganizer, organizer_id)
assert organizer is None

View File

@ -6,7 +6,7 @@ def test_read(client, app, db, seeder, utils):
utils.get_ok(url)
def test_put(client, seeder, utils, app):
def test_put(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -17,7 +17,7 @@ def test_put(client, seeder, utils, app):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place.name == "Neuer Name"
@ -28,7 +28,7 @@ def test_put_nonActiveReturnsUnauthorized(client, seeder, db, utils, app):
with app.app_context():
from project.models import User
user = User.query.get(user_id)
user = db.session.get(User, user_id)
user.active = False
db.session.commit()
@ -37,7 +37,7 @@ def test_put_nonActiveReturnsUnauthorized(client, seeder, db, utils, app):
utils.assert_response_unauthorized(response)
def test_patch(client, seeder, utils, app):
def test_patch(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -48,7 +48,7 @@ def test_patch(client, seeder, utils, app):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place.name == "Meine Crew"
assert place.description == "Klasse"
@ -64,7 +64,7 @@ def test_patch_location(db, seeder, utils, app):
location.postalCode = "12345"
location.city = "City"
event = EventPlace.query.get(place_id)
event = db.session.get(EventPlace, place_id)
event.location = location
db.session.commit()
@ -80,12 +80,12 @@ def test_patch_location(db, seeder, utils, app):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place.location.id == location_id
assert place.location.postalCode == "54321"
def test_delete(client, seeder, utils, app):
def test_delete(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_api_access()
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -96,5 +96,5 @@ def test_delete(client, seeder, utils, app):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place is None

View File

@ -44,7 +44,7 @@ def test_organization_invitation_read_wrongEmail(client, seeder, utils):
utils.assert_response_unauthorized(response)
def test_organization_invitation_delete(client, app, seeder, utils):
def test_organization_invitation_delete(client, app, seeder, utils, db):
_, admin_unit_id = seeder.setup_base(log_in=False)
invitation_id = seeder.create_admin_unit_invitation(admin_unit_id)
@ -61,7 +61,7 @@ def test_organization_invitation_delete(client, app, seeder, utils):
with app.app_context():
from project.models import AdminUnitInvitation
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is None

View File

@ -292,7 +292,7 @@ class Seeder(object):
with self._app.app_context():
from project.models import OAuth2Client
oauth2_client = OAuth2Client.query.get(oauth2_client_id)
oauth2_client = self._db.session.get(OAuth2Client, oauth2_client_id)
client_id = oauth2_client.client_id
client_secret = oauth2_client.client_secret
scope = oauth2_client.scope
@ -314,7 +314,7 @@ class Seeder(object):
from project.models import Event
with self._app.app_context():
event = Event.query.get(event_id)
event = self._db.session.get(Event, event_id)
event_date_id = event.dates[0].id
return event_date_id
@ -400,7 +400,7 @@ class Seeder(object):
from project.services.event import update_event
with self._app.app_context():
event = Event.query.get(event_id)
event = self._db.session.get(Event, event_id)
date_definition = self.create_event_date_definition(
start, end, allday, recurrence_rule
@ -501,7 +501,7 @@ class Seeder(object):
with self._app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = self._db.session.get(Event, event_id)
event.photo_id = image_id
self._db.session.commit()
@ -542,8 +542,8 @@ class Seeder(object):
from project.models import Event, EventList
with self._app.app_context():
event = Event.query.get(event_id)
event_list = EventList.query.get(event_list_id)
event = self._db.session.get(Event, event_id)
event_list = self._db.session.get(EventList, event_list_id)
event_list.events.append(event)
self._db.session.commit()

View File

@ -1,7 +1,7 @@
import pytest
def test_update_event_dates_with_recurrence_rule(client, seeder, utils, app):
def test_update_event_dates_with_recurrence_rule(client, seeder, utils, app, db):
user_id, admin_unit_id = seeder.setup_base()
event_id = seeder.create_event(admin_unit_id)
@ -10,7 +10,7 @@ def test_update_event_dates_with_recurrence_rule(client, seeder, utils, app):
from project.models import Event
from project.services.event import update_event_dates_with_recurrence_rule
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2030, 12, 31, 14, 30)
date_definition.end = create_berlin_date(2030, 12, 31, 16, 30)
@ -55,7 +55,7 @@ def test_update_event_dates_with_recurrence_rule(client, seeder, utils, app):
def test_update_event_dates_with_recurrence_rule_past(
client, seeder, utils, app, mocker
client, seeder, utils, app, db, mocker
):
user_id, admin_unit_id = seeder.setup_base()
event_id = seeder.create_event(admin_unit_id)
@ -67,7 +67,7 @@ def test_update_event_dates_with_recurrence_rule_past(
utils.mock_now(mocker, 2020, 1, 3)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2020, 1, 2, 14, 30)
date_definition.end = create_berlin_date(2020, 1, 2, 16, 30)
@ -87,7 +87,7 @@ def test_update_event_dates_with_recurrence_rule_past(
def test_update_event_dates_with_recurrence_rule_past_forever(
client, seeder, utils, app, mocker
client, seeder, utils, app, db, mocker
):
user_id, admin_unit_id = seeder.setup_base()
event_id = seeder.create_event(admin_unit_id)
@ -99,7 +99,7 @@ def test_update_event_dates_with_recurrence_rule_past_forever(
utils.mock_now(mocker, 2020, 1, 3)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2019, 1, 1, 14, 30)
date_definition.end = create_berlin_date(2019, 1, 1, 16, 30)
@ -124,7 +124,7 @@ def test_update_event_dates_with_recurrence_rule_past_forever(
def test_update_event_dates_with_recurrence_rule_exdate(
client, seeder, utils, app, mocker
client, seeder, utils, app, db, mocker
):
user_id, admin_unit_id = seeder.setup_base()
event_id = seeder.create_event(admin_unit_id)
@ -136,7 +136,7 @@ def test_update_event_dates_with_recurrence_rule_exdate(
utils.mock_now(mocker, 2021, 6, 1)
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2021, 4, 21, 17, 0)
date_definition.end = create_berlin_date(2021, 4, 21, 18, 0)
@ -160,7 +160,7 @@ def test_get_meta_data(seeder, app, db):
from project.models import Event, EventAttendanceMode, Location
from project.services.event import get_meta_data
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.attendance_mode = EventAttendanceMode.offline
location = Location()
@ -282,7 +282,7 @@ def test_create_ical_events_for_event(client, app, db, utils, seeder):
from project.models import Event, EventStatus, Location
from project.services.event import create_ical_events_for_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.description = "This is a fantastic event. Watch out!"
event.status = EventStatus.cancelled

View File

@ -5,7 +5,7 @@ def test_has_admin_unit_member_role(client, app, db, seeder):
from project.access import has_admin_unit_member_role
from project.models import AdminUnitMember
member = AdminUnitMember.query.get(member_id)
member = db.session.get(AdminUnitMember, member_id)
assert has_admin_unit_member_role(member, "admin") is False
@ -19,7 +19,7 @@ def test_has_current_user_member_role_for_admin_unit(client, app, db, seeder):
from project.access import has_current_user_member_role_for_admin_unit
from project.models import AdminUnitMember
member = AdminUnitMember.query.get(member_id)
member = db.session.get(AdminUnitMember, member_id)
login_user(member.user)
assert (

View File

@ -8,7 +8,7 @@ def test_get_sd_for_admin_unit(client, app, db, seeder):
from project.jsonld import get_sd_for_admin_unit
from project.models import AdminUnit
admin_unit = AdminUnit.query.get(admin_unit_id)
admin_unit = db.session.get(AdminUnit, admin_unit_id)
admin_unit.url = "http://www.goslar.de"
result = get_sd_for_admin_unit(admin_unit)
@ -23,7 +23,7 @@ def test_get_sd_for_organizer(client, app, db, seeder):
from project.jsonld import get_sd_for_organizer
from project.models import EventOrganizer
organizer = EventOrganizer.query.get(organizer_id)
organizer = db.session.get(EventOrganizer, organizer_id)
organizer.email = "info@goslar.de"
organizer.phone = "12345"
organizer.fax = "67890"
@ -46,7 +46,7 @@ def test_get_sd_for_place(client, app, db, utils, seeder):
from project.jsonld import get_sd_for_place
from project.models import EventPlace, Image, Location
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
place.url = "http://www.goslar.de"
photo = Image()
@ -83,7 +83,7 @@ def test_get_sd_for_place_noCoordinates(client, app, db, utils, seeder):
from project.jsonld import get_sd_for_place
from project.models import EventPlace, Location
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
location = Location()
location.street = "Markt 7"
@ -107,7 +107,7 @@ def test_get_sd_for_event_date(client, app, db, seeder, utils):
from project.models import Event, Image
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2030, 12, 31, 14, 30)
date_definition.end = create_berlin_date(2030, 12, 31, 16, 30)
@ -142,14 +142,12 @@ def test_get_sd_for_event_date_allday(client, app, db, seeder, utils):
event_id = seeder.create_event(admin_unit_id)
with app.app_context():
import json
from project.dateutils import create_berlin_date
from project.jsonld import DateTimeEncoder, get_sd_for_event_date
from project.jsonld import get_sd_for_event_date
from project.models import Event
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
date_definition = event.date_definitions[0]
date_definition.start = create_berlin_date(2030, 12, 31, 14, 30)
date_definition.end = create_berlin_date(2030, 12, 31, 16, 30)
@ -160,8 +158,8 @@ def test_get_sd_for_event_date_allday(client, app, db, seeder, utils):
event_date = event.dates[0]
with app.test_request_context():
structured_data = json.dumps(
get_sd_for_event_date(event_date), indent=2, cls=DateTimeEncoder
structured_data = app.json.dumps(
get_sd_for_event_date(event_date), indent=2
)
assert '"startDate": "2030-12-31"' in structured_data
@ -178,7 +176,7 @@ def test_get_sd_for_event_date_with_co_organizer(client, app, db, seeder, utils)
from project.jsonld import get_sd_for_event_date
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event_date = event.dates[0]
with app.test_request_context():
@ -202,7 +200,7 @@ def test_get_sd_for_event_date_ageRange(
from project.models import Event
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.age_from = age_from
event.age_to = age_to
@ -235,7 +233,7 @@ def test_get_sd_for_event_date_eventAttendanceMode(
from project.models import Event, EventAttendanceMode
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.attendance_mode = EventAttendanceMode(attendance_mode)
update_event(event)
@ -269,7 +267,7 @@ def test_get_sd_for_event_date_eventStatus(
from project.models import Event, EventStatus
from project.services.event import update_event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.status = EventStatus(status)
update_event(event)

View File

@ -21,7 +21,7 @@ def test_event_category(client, app, db, seeder):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
event.categories = []
db.session.commit()
@ -69,7 +69,7 @@ def test_event_allday(client, app, db, seeder):
from project.models import Event
# With Start
event = Event.query.get(event_with_start_id)
event = db.session.get(Event, event_with_start_id)
date_definition = event.date_definitions[0]
assert date_definition.allday
assert date_definition.start == create_berlin_date(2030, 12, 31, 0, 0)
@ -81,7 +81,7 @@ def test_event_allday(client, app, db, seeder):
assert event_date.end == create_berlin_date(2030, 12, 31, 23, 59, 59)
# With Start and End
event = Event.query.get(event_with_start_and_end_id)
event = db.session.get(Event, event_with_start_and_end_id)
date_definition = event.date_definitions[0]
assert date_definition.allday
assert date_definition.start == create_berlin_date(2030, 12, 31, 0, 0)
@ -103,10 +103,10 @@ def test_event_has_multiple_dates(client, app, db, seeder):
with app.app_context():
from project.models import Event
event_with_recc = Event.query.get(event_with_recc_id)
event_with_recc = db.session.get(Event, event_with_recc_id)
assert event_with_recc.has_multiple_dates() is True
event_without_recc = Event.query.get(event_without_recc_id)
event_without_recc = db.session.get(Event, event_without_recc_id)
assert event_without_recc.has_multiple_dates() is False
@ -153,7 +153,7 @@ def test_event_date_defintion_deletion(client, app, db, seeder):
from project.models import Event
# Initial eine Definition
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.date_definitions) == 1
date_definition1 = event.date_definitions[0]
@ -163,7 +163,7 @@ def test_event_date_defintion_deletion(client, app, db, seeder):
event.date_definitions = [date_definition1, date_definition2]
db.session.commit()
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.date_definitions) == 2
assert len(EventDateDefinition.query.all()) == 2
@ -174,7 +174,7 @@ def test_event_date_defintion_deletion(client, app, db, seeder):
db.session.delete(date_definition1)
db.session.commit()
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.date_definitions) == 1
assert len(EventDateDefinition.query.all()) == 1
assert event.date_definitions[0].id == date_definition2_id
@ -226,7 +226,7 @@ def test_admin_unit_deletion(client, app, db, seeder):
admin_unit = get_admin_unit_by_id(admin_unit_id)
other_admin_unit = get_admin_unit_by_id(other_admin_unit_id)
my_event = Event.query.get(my_event_id)
my_event = db.session.get(Event, my_event_id)
date_id = my_event.dates[0].id
date_definition_id = my_event.date_definitions[0].id
@ -234,23 +234,27 @@ def test_admin_unit_deletion(client, app, db, seeder):
db.session.commit()
assert len(other_admin_unit.outgoing_relations) == 0
assert Event.query.get(my_event_id) is None
assert EventDate.query.get(date_id) is None
assert EventDateDefinition.query.get(date_definition_id) is None
assert AdminUnitRelation.query.get(incoming_relation_id) is None
assert AdminUnitRelation.query.get(outgoing_relation_id) is None
assert EventReference.query.get(incoming_reference_id) is None
assert EventReference.query.get(outgoing_reference_id) is None
assert EventReferenceRequest.query.get(incoming_reference_request_id) is None
assert EventReferenceRequest.query.get(outgoing_reference_request_id) is None
assert EventSuggestion.query.get(suggestion_id) is None
assert EventPlace.query.get(event_place_id) is None
assert EventOrganizer.query.get(organizer_id) is None
assert AdminUnitMemberInvitation.query.get(invitation_id) is None
assert EventList.query.get(event_list_id) is None
assert db.session.get(Event, my_event_id) is None
assert db.session.get(EventDate, date_id) is None
assert db.session.get(EventDateDefinition, date_definition_id) is None
assert db.session.get(AdminUnitRelation, incoming_relation_id) is None
assert db.session.get(AdminUnitRelation, outgoing_relation_id) is None
assert db.session.get(EventReference, incoming_reference_id) is None
assert db.session.get(EventReference, outgoing_reference_id) is None
assert (
db.session.get(EventReferenceRequest, incoming_reference_request_id) is None
)
assert (
db.session.get(EventReferenceRequest, outgoing_reference_request_id) is None
)
assert db.session.get(EventSuggestion, suggestion_id) is None
assert db.session.get(EventPlace, event_place_id) is None
assert db.session.get(EventOrganizer, organizer_id) is None
assert db.session.get(AdminUnitMemberInvitation, invitation_id) is None
assert db.session.get(EventList, event_list_id) is None
assert AdminUnit.query.get(other_admin_unit_id) is not None
assert Event.query.get(other_event_id) is not None
assert db.session.get(AdminUnit, other_admin_unit_id) is not None
assert db.session.get(Event, other_event_id) is not None
def test_event_co_organizers_deletion(client, app, db, seeder):
@ -262,12 +266,12 @@ def test_event_co_organizers_deletion(client, app, db, seeder):
with app.app_context():
from project.models import Event, EventOrganizer
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.co_organizers) == 2
assert event.co_organizers[0].id == organizer_a_id
assert event.co_organizers[1].id == organizer_b_id
organizer_a = EventOrganizer.query.get(organizer_a_id)
organizer_a = db.session.get(EventOrganizer, organizer_a_id)
db.session.delete(organizer_a)
db.session.commit()
assert len(event.co_organizers) == 1
@ -275,7 +279,7 @@ def test_event_co_organizers_deletion(client, app, db, seeder):
db.session.delete(event)
db.session.commit()
assert EventOrganizer.query.get(organizer_b_id).id is not None
assert db.session.get(EventOrganizer, organizer_b_id).id is not None
def test_admin_unit_verification(client, app, db, seeder):
@ -289,7 +293,7 @@ def test_admin_unit_verification(client, app, db, seeder):
new_admin_unit = AdminUnit()
assert not new_admin_unit.is_verified
admin_unit = AdminUnit.query.get(admin_unit_id)
admin_unit = db.session.get(AdminUnit, admin_unit_id)
admin_unit.can_verify_other = True
db.session.commit()
@ -300,18 +304,18 @@ def test_admin_unit_verification(client, app, db, seeder):
all_verified = AdminUnit.query.filter(AdminUnit.is_verified).all()
assert len(all_verified) == 0
relation = AdminUnitRelation.query.get(relation_id)
relation = db.session.get(AdminUnitRelation, relation_id)
relation.verify = True
db.session.commit()
other_admin_unit = AdminUnit.query.get(other_admin_unit_id)
other_admin_unit = db.session.get(AdminUnit, other_admin_unit_id)
assert other_admin_unit.is_verified
all_verified = AdminUnit.query.filter(AdminUnit.is_verified).all()
assert len(all_verified) == 1
assert all_verified[0].id == other_admin_unit_id
admin_unit = AdminUnit.query.get(admin_unit_id)
admin_unit = db.session.get(AdminUnit, admin_unit_id)
admin_unit.can_verify_other = False
db.session.commit()
@ -334,7 +338,7 @@ def test_admin_unit_invitations(client, app, db, seeder):
db.session.commit()
assert len(admin_unit.admin_unit_invitations) == 0
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is None
@ -347,33 +351,33 @@ def test_event_list_deletion(client, app, db, seeder):
with app.app_context():
from project.models import Event, EventList
event_list_a = EventList.query.get(event_list_a_id)
event_list_a = db.session.get(EventList, event_list_a_id)
assert len(event_list_a.events) == 1
assert event_list_a.events[0].id == event_id
event_list_b = EventList.query.get(event_list_b_id)
event_list_b = db.session.get(EventList, event_list_b_id)
assert len(event_list_b.events) == 1
assert event_list_b.events[0].id == event_id
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert len(event.event_lists) == 2
assert event.event_lists[0].id == event_list_a_id
assert event.event_lists[1].id == event_list_b_id
event_list_a = EventList.query.get(event_list_a_id)
event_list_a = db.session.get(EventList, event_list_a_id)
db.session.delete(event_list_a)
db.session.commit()
assert len(event.event_lists) == 1
assert event.event_lists[0].id == event_list_b_id
event_list_b = EventList.query.get(event_list_b_id)
event_list_b = db.session.get(EventList, event_list_b_id)
assert len(event_list_b.events) == 1
assert event_list_b.events[0].id == event_id
db.session.delete(event)
db.session.commit()
event_list_b = EventList.query.get(event_list_b_id)
event_list_b = db.session.get(EventList, event_list_b_id)
assert len(event_list_b.events) == 0
@ -384,5 +388,5 @@ def test_event_is_favored_by_current_user(client, app, db, seeder):
with app.app_context():
from project.models import Event
event = Event.query.get(event_id)
event = db.session.get(Event, event_id)
assert event.is_favored_by_current_user() is False

View File

@ -238,10 +238,11 @@ class UtilActions(object):
return url
def get_image_url_for_id(self, image_id, **values):
from project import db
from project.models import Image
with self._app.app_context():
image = Image.query.get(image_id)
image = db.session.get(Image, image_id)
url = self.get_image_url(image, **values)
return url

View File

@ -152,7 +152,7 @@ def test_admin_user_update(client, seeder, utils, app, mocker, db, db_error):
@pytest.mark.parametrize("db_error", [True, False])
@pytest.mark.parametrize("non_match", [True, False])
def test_user_delete(client, seeder, utils, app, mocker, db_error, non_match):
def test_user_delete(client, seeder, utils, app, db, mocker, db_error, non_match):
user_id, admin_unit_id = seeder.setup_base(True)
other_user_id = seeder.create_user("other@test.de")
@ -190,7 +190,7 @@ def test_user_delete(client, seeder, utils, app, mocker, db_error, non_match):
with app.app_context():
from project.models import User
user = User.query.get(other_user_id)
user = db.session.get(User, other_user_id)
assert user is None
@ -246,7 +246,7 @@ def test_admin_admin_unit_update(client, seeder, utils, app, mocker, db, db_erro
@pytest.mark.parametrize("db_error", [True, False])
@pytest.mark.parametrize("non_match", [True, False])
def test_admin_unit_delete(client, seeder, utils, app, mocker, db_error, non_match):
def test_admin_unit_delete(client, seeder, utils, app, db, mocker, db_error, non_match):
user_id, admin_unit_id = seeder.setup_base(True)
url = utils.get_url("admin_admin_unit_delete", id=admin_unit_id)
@ -283,5 +283,5 @@ def test_admin_unit_delete(client, seeder, utils, app, mocker, db_error, non_mat
with app.app_context():
from project.models import AdminUnit
admin_unit = AdminUnit.query.get(admin_unit_id)
admin_unit = db.session.get(AdminUnit, admin_unit_id)
assert admin_unit is None

View File

@ -134,7 +134,7 @@ def test_create_requiresAdmin_memberOfOrgWithFlag(client, app, utils, seeder):
assert response.status_code == 302
def test_create_from_invitation(client, app, utils, seeder, mocker):
def test_create_from_invitation(client, app, db, utils, seeder, mocker):
mail_mock = utils.mock_send_mails(mocker)
user_id = seeder.create_user()
admin_unit_id = seeder.create_admin_unit(
@ -176,7 +176,7 @@ def test_create_from_invitation(client, app, utils, seeder, mocker):
assert relation.invited
relation_id = relation.id
invitation = AdminUnitInvitation.query.get(invitation_id)
invitation = db.session.get(AdminUnitInvitation, invitation_id)
assert invitation is None
invitation_url = utils.get_url(

View File

@ -379,7 +379,9 @@ def test_duplicate(client, app, utils, seeder, mocker, allday):
@pytest.mark.parametrize("free_text", [True, False])
@pytest.mark.parametrize("allday", [True, False])
def test_create_fromSuggestion(client, app, utils, seeder, mocker, free_text, allday):
def test_create_fromSuggestion(
client, app, db, utils, seeder, mocker, free_text, allday
):
user_id, admin_unit_id = seeder.setup_base()
suggestion_id = seeder.create_event_suggestion(admin_unit_id, free_text, allday)
@ -404,7 +406,7 @@ def test_create_fromSuggestion(client, app, utils, seeder, mocker, free_text, al
assert event is not None
assert event.date_definitions[0].allday == allday
suggestion = EventSuggestion.query.get(suggestion_id)
suggestion = db.session.get(EventSuggestion, suggestion_id)
assert suggestion is not None
assert suggestion.verified
assert suggestion.event_id == event.id

View File

@ -39,7 +39,7 @@ def test_create(client, app, utils, seeder, mocker, db_error):
@pytest.mark.parametrize("db_error", [True, False])
def test_update(client, seeder, utils, app, mocker, db_error):
def test_update(client, seeder, utils, app, db, mocker, db_error):
user_id, admin_unit_id = seeder.setup_base()
place_id = seeder.upsert_default_event_place(admin_unit_id)
@ -68,13 +68,13 @@ def test_update(client, seeder, utils, app, mocker, db_error):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place.name == "Neuer Name"
@pytest.mark.parametrize("db_error", [True, False])
@pytest.mark.parametrize("non_match", [True, False])
def test_delete(client, seeder, utils, app, mocker, db_error, non_match):
def test_delete(client, seeder, utils, app, db, mocker, db_error, non_match):
user_id, admin_unit_id = seeder.setup_base()
place_id = seeder.upsert_event_place(admin_unit_id, "Mein Ort")
@ -114,7 +114,7 @@ def test_delete(client, seeder, utils, app, mocker, db_error, non_match):
with app.app_context():
from project.models import EventPlace
place = EventPlace.query.get(place_id)
place = db.session.get(EventPlace, place_id)
assert place is None

View File

@ -35,7 +35,7 @@ def test_reject(client, app, utils, seeder, mocker, db, db_error, is_verified):
with app.app_context():
from project.models import EventReviewStatus, EventSuggestion
suggestion = EventSuggestion.query.get(event_suggestion_id)
suggestion = db.session.get(EventSuggestion, event_suggestion_id)
suggestion.review_status = EventReviewStatus.verified
db.session.commit()
@ -71,6 +71,6 @@ def test_reject(client, app, utils, seeder, mocker, db, db_error, is_verified):
with app.app_context():
from project.models import EventReviewStatus, EventSuggestion
suggestion = EventSuggestion.query.get(event_suggestion_id)
suggestion = db.session.get(EventSuggestion, event_suggestion_id)
assert suggestion.review_status == EventReviewStatus.rejected
assert suggestion.rejection_resaon is None

View File

@ -64,7 +64,7 @@ def test_create_authorization_code(client, app, utils, seeder, mocker, db_error)
@pytest.mark.parametrize("db_error", [True, False])
def test_update(client, seeder, utils, app, mocker, db_error):
def test_update(client, seeder, utils, app, db, mocker, db_error):
user_id, admin_unit_id = seeder.setup_base(True)
oauth2_client_id = seeder.insert_default_oauth2_client(user_id)
@ -92,14 +92,14 @@ def test_update(client, seeder, utils, app, mocker, db_error):
with app.app_context():
from project.models import OAuth2Client
oauth2_client = OAuth2Client.query.get(oauth2_client_id)
oauth2_client = db.session.get(OAuth2Client, oauth2_client_id)
assert oauth2_client.client_name == "Neuer Name"
assert oauth2_client.redirect_uris == ["localhost:1337", "localhost:1338"]
@pytest.mark.parametrize("db_error", [True, False])
@pytest.mark.parametrize("non_match", [True, False])
def test_delete(client, seeder, utils, app, mocker, db_error, non_match):
def test_delete(client, seeder, utils, app, db, mocker, db_error, non_match):
user_id, admin_unit_id = seeder.setup_base(True)
oauth2_client_id = seeder.insert_default_oauth2_client(user_id)
@ -135,5 +135,5 @@ def test_delete(client, seeder, utils, app, mocker, db_error, non_match):
with app.app_context():
from project.models import OAuth2Client
oauth2_client = OAuth2Client.query.get(oauth2_client_id)
oauth2_client = db.session.get(OAuth2Client, oauth2_client_id)
assert oauth2_client is None

View File

@ -10,7 +10,7 @@ def test_list(client, seeder, utils):
@pytest.mark.parametrize("db_error", [True, False])
def test_revoke(client, seeder, utils, app, mocker, db_error):
def test_revoke(client, seeder, utils, app, db, mocker, db_error):
user_id, admin_unit_id = seeder.setup_api_access()
utils.login()
@ -41,7 +41,7 @@ def test_revoke(client, seeder, utils, app, mocker, db_error):
with app.app_context():
from project.models import OAuth2Token
oauth2_token = OAuth2Token.query.get(oauth2_token_id)
oauth2_token = db.session.get(OAuth2Token, oauth2_token_id)
assert oauth2_token.is_revoked() > 0
# Kann nicht zweimal revoked werden

Some files were not shown because too many files have changed in this diff Show More