diff --git a/forms/event_suggestion.py b/forms/event_suggestion.py index 6ad6228..6cd6170 100644 --- a/forms/event_suggestion.py +++ b/forms/event_suggestion.py @@ -33,10 +33,10 @@ class CreateEventSuggestionForm(FlaskForm): for name, field in self._fields.items(): if name == 'photo' and not obj.photo: obj.photo = Image() - if name == 'event_place_id' and isinstance(self.event_place_id.data, str): + if name == 'event_place_id' and self.event_place_id.is_free_text(): obj.event_place_text = self.event_place_id.data obj.event_place_id = None - elif name == 'organizer_id' and isinstance(self.organizer_id.data, str): + elif name == 'organizer_id' and self.organizer_id.is_free_text(): obj.organizer_text = self.organizer_id.data obj.organizer_id = None else: diff --git a/forms/widgets.py b/forms/widgets.py index e8e86ab..61f270b 100644 --- a/forms/widgets.py +++ b/forms/widgets.py @@ -1,8 +1,9 @@ from wtforms import DateTimeField, SelectMultipleField, SelectField from wtforms.widgets import html_params, HTMLString, ListWidget, CheckboxInput +from wtforms.validators import StopValidation import pytz from datetime import datetime -from flask_babelex import to_user_timezone +from flask_babelex import to_user_timezone, gettext from dateutils import berlin_tz class MultiCheckboxField(SelectMultipleField): @@ -91,5 +92,15 @@ def try_to_int(value): class TagSelectField(SelectField): - def __init__(self, label=None, validators=None, coerce=try_to_int, choices=None, validate_choice=False, **kwargs): + def __init__(self, label=None, validators=None, coerce=try_to_int, choices=None, validate_choice=True, **kwargs): super(TagSelectField, self).__init__(label, validators, coerce, choices, validate_choice, **kwargs) + + def pre_validate(self, form): + if self.is_free_text(): + if not self.data or not self.data.strip(): + raise StopValidation(gettext('This field is required')) + else: + super(TagSelectField, self).pre_validate(form) + + def is_free_text(self): + return isinstance(self.data, str) diff --git a/migrations/versions/00daa8c472ba_.py b/migrations/versions/00daa8c472ba_.py new file mode 100644 index 0000000..79f802e --- /dev/null +++ b/migrations/versions/00daa8c472ba_.py @@ -0,0 +1,42 @@ +"""empty message + +Revision ID: 00daa8c472ba +Revises: 50337ecd23db +Create Date: 2020-10-27 20:58:57.392619 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utils +import db + + +# revision identifiers, used by Alembic. +revision = '00daa8c472ba' +down_revision = '50337ecd23db' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + #op.drop_table('spatial_ref_sys') + op.drop_constraint('eventsuggestion_event_id_fkey', 'eventsuggestion', type_='foreignkey') + op.create_foreign_key(None, 'eventsuggestion', 'event', ['event_id'], ['id'], ondelete='SET NULL') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'eventsuggestion', type_='foreignkey') + op.create_foreign_key('eventsuggestion_event_id_fkey', 'eventsuggestion', 'event', ['event_id'], ['id']) + op.create_table('spatial_ref_sys', + sa.Column('srid', sa.INTEGER(), autoincrement=False, nullable=False), + sa.Column('auth_name', sa.VARCHAR(length=256), autoincrement=False, nullable=True), + sa.Column('auth_srid', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('srtext', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + sa.Column('proj4text', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + sa.CheckConstraint('(srid > 0) AND (srid <= 998999)', name='spatial_ref_sys_srid_check'), + sa.PrimaryKeyConstraint('srid', name='spatial_ref_sys_pkey') + ) + # ### end Alembic commands ### diff --git a/migrations/versions/50337ecd23db_.py b/migrations/versions/50337ecd23db_.py new file mode 100644 index 0000000..6e914f4 --- /dev/null +++ b/migrations/versions/50337ecd23db_.py @@ -0,0 +1,42 @@ +"""empty message + +Revision ID: 50337ecd23db +Revises: 6be822396123 +Create Date: 2020-10-27 20:31:42.566357 + +""" +from alembic import op +import sqlalchemy as sa +import sqlalchemy_utils +import db + + +# revision identifiers, used by Alembic. +revision = '50337ecd23db' +down_revision = '6be822396123' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + #op.drop_table('spatial_ref_sys') + op.add_column('eventsuggestion', sa.Column('event_id', sa.Integer(), nullable=True)) + op.create_foreign_key(None, 'eventsuggestion', 'event', ['event_id'], ['id']) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_constraint(None, 'eventsuggestion', type_='foreignkey') + op.drop_column('eventsuggestion', 'event_id') + op.create_table('spatial_ref_sys', + sa.Column('srid', sa.INTEGER(), autoincrement=False, nullable=False), + sa.Column('auth_name', sa.VARCHAR(length=256), autoincrement=False, nullable=True), + sa.Column('auth_srid', sa.INTEGER(), autoincrement=False, nullable=True), + sa.Column('srtext', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + sa.Column('proj4text', sa.VARCHAR(length=2048), autoincrement=False, nullable=True), + sa.CheckConstraint('(srid > 0) AND (srid <= 998999)', name='spatial_ref_sys_srid_check'), + sa.PrimaryKeyConstraint('srid', name='spatial_ref_sys_pkey') + ) + # ### end Alembic commands ### diff --git a/models.py b/models.py index c3cc107..b0bb6fe 100644 --- a/models.py +++ b/models.py @@ -295,6 +295,10 @@ class EventReferenceRequest(db.Model, TrackableMixin): class EventSuggestion(db.Model, TrackableMixin): __tablename__ = 'eventsuggestion' + __table_args__ = ( + CheckConstraint('NOT(event_place_id IS NULL AND event_place_text IS NULL)'), + CheckConstraint('NOT(organizer_id IS NULL AND organizer_text IS NULL)'), + ) id = Column(Integer(), primary_key=True) name = Column(Unicode(255), nullable=False) @@ -323,6 +327,9 @@ class EventSuggestion(db.Model, TrackableMixin): photo_id = db.Column(db.Integer, db.ForeignKey('image.id')) photo = db.relationship('Image', uselist=False) + event_id = db.Column(db.Integer, db.ForeignKey('event.id', ondelete='SET NULL'), nullable=True) + event = db.relationship('Event', uselist=False) + @hybrid_property def verified(self): return self.review_status == EventReviewStatus.verified diff --git a/templates/_macros.html b/templates/_macros.html index 3869819..df23b8a 100644 --- a/templates/_macros.html +++ b/templates/_macros.html @@ -236,8 +236,8 @@ {% endmacro %} {% macro render_event_review_status_pill(event) %} -{% if event.review_status and event.review_status != 2 %} - {{ event.review_status | loc_enum }} +{% if event.review_status %} + {{ event.review_status | loc_enum }} {% endif %} {% endmacro %} diff --git a/templates/event_suggestion/review.html b/templates/event_suggestion/review.html index e2d44a6..df4e967 100644 --- a/templates/event_suggestion/review.html +++ b/templates/event_suggestion/review.html @@ -40,20 +40,26 @@ -
+{% if event_suggestion.verified and event_suggestion.event_id %} + +{% else %} + -