mirror of
https://github.com/lucaspalomodevelop/eventcally.git
synced 2026-03-13 00:07:22 +00:00
- [x] organizer eigene entität mit adminunitid
This commit is contained in:
parent
d2ca5e6f2e
commit
0974a2e3a6
658
app.py
658
app.py
@ -54,7 +54,7 @@ app.json_encoder = DateTimeEncoder
|
||||
|
||||
# Setup Flask-Security
|
||||
# Define models
|
||||
from models import EventPlace, EventOrganizer, EventCategory, Image, EventSuggestion, EventSuggestionDate, OrgOrAdminUnit, Actor, Place, Location, User, Role, AdminUnit, AdminUnitMember, AdminUnitMemberRole, OrgMember, OrgMemberRole, Organization, AdminUnitOrg, AdminUnitOrgRole, Event, EventDate
|
||||
from models import EventPlace, EventOrganizer, EventCategory, Image, OrgOrAdminUnit, Actor, Place, Location, User, Role, AdminUnit, AdminUnitMember, AdminUnitMemberRole, OrgMember, OrgMemberRole, Organization, AdminUnitOrg, AdminUnitOrgRole, Event, EventDate
|
||||
user_datastore = SQLAlchemySessionUserDatastore(db.session, User, Role)
|
||||
security = Security(app, user_datastore)
|
||||
from oauth import blueprint
|
||||
@ -116,7 +116,7 @@ def upsert_user(email, password="password"):
|
||||
result = user_datastore.create_user(email=email, password=hash_password(password))
|
||||
return result
|
||||
|
||||
def upsert_admin_unit(unit_name, short_name):
|
||||
def upsert_admin_unit(unit_name, short_name = None):
|
||||
admin_unit = AdminUnit.query.filter_by(name = unit_name).first()
|
||||
if admin_unit is None:
|
||||
admin_unit = AdminUnit(name = unit_name)
|
||||
@ -221,10 +221,10 @@ def upsert_image_with_res(image, res):
|
||||
|
||||
return image
|
||||
|
||||
def upsert_organization(org_name, street = None, postalCode = None, city = None, latitude = 0, longitude = 0, legal_name = None, url=None, logo_res=None):
|
||||
result = Organization.query.filter_by(name = org_name).first()
|
||||
def upsert_organization(name, street = None, postalCode = None, city = None, latitude = 0, longitude = 0, legal_name = None, url=None, logo_res=None):
|
||||
result = Organization.query.filter_by(name = name).first()
|
||||
if result is None:
|
||||
result = Organization(name = org_name)
|
||||
result = Organization(name = name)
|
||||
db.session.add(result)
|
||||
|
||||
result.legal_name = legal_name
|
||||
@ -274,6 +274,24 @@ def upsert_location(street, postalCode, city, latitude = 0, longitude = 0, state
|
||||
|
||||
return result
|
||||
|
||||
def upsert_event_organizer(admin_unit_id, name):
|
||||
result = EventOrganizer.query.filter(and_(EventOrganizer.name == name, EventOrganizer.admin_unit_id == admin_unit_id)).first()
|
||||
if result is None:
|
||||
result = EventOrganizer(name = name, admin_unit_id=admin_unit_id)
|
||||
result.location = Location()
|
||||
db.session.add(result)
|
||||
|
||||
return result
|
||||
|
||||
def upsert_event_place(admin_unit_id, organizer_id, name):
|
||||
result = EventPlace.query.filter(and_(EventPlace.name == name, EventPlace.admin_unit_id == admin_unit_id, EventPlace.organizer_id == organizer_id)).first()
|
||||
if result is None:
|
||||
result = EventPlace(name = name, admin_unit_id=admin_unit_id, organizer_id=organizer_id)
|
||||
result.location = Location()
|
||||
db.session.add(result)
|
||||
|
||||
return result
|
||||
|
||||
def upsert_place(name, street = None, postalCode = None, city = None, latitude = 0, longitude = 0, url=None, description=None, photo_res=None):
|
||||
result = Place.query.filter_by(name = name).first()
|
||||
if result is None:
|
||||
@ -294,33 +312,6 @@ def upsert_place(name, street = None, postalCode = None, city = None, latitude =
|
||||
|
||||
return result
|
||||
|
||||
# def upsert_event_suggestion(event_name, host_name, place_name, start, description, link = None, admin_unit = None):
|
||||
# if admin_unit is None:
|
||||
# admin_unit = get_admin_unit('Stadt Goslar')
|
||||
|
||||
# result = EventSuggestion.query.filter_by(event_name = event_name).first()
|
||||
# if result is None:
|
||||
# result = EventSuggestion()
|
||||
# db.session.add(result)
|
||||
|
||||
# result.admin_unit = admin_unit
|
||||
# result.event_name = event_name
|
||||
# result.description = description
|
||||
# result.external_link = link
|
||||
# result.place_name = place_name
|
||||
# result.host_name = host_name
|
||||
|
||||
# result.place_postalCode = "Dummy postal code"
|
||||
# result.place_city = "Dummy city"
|
||||
# result.contact_name = "Dummy contact name"
|
||||
# result.contact_email = "Dummy contact email"
|
||||
|
||||
# eventDate = EventSuggestionDate(event_suggestion_id = result.id, start=start)
|
||||
# result.dates = []
|
||||
# result.dates.append(eventDate)
|
||||
|
||||
# return result
|
||||
|
||||
def upsert_event_category(category_name):
|
||||
result = EventCategory.query.filter_by(name = category_name).first()
|
||||
if result is None:
|
||||
@ -380,39 +371,6 @@ def update_event_dates_with_recurrence_rule(event, start, end):
|
||||
event.dates = [date for date in event.dates if date not in dates_to_remove]
|
||||
event.dates.extend(dates_to_add)
|
||||
|
||||
def upsert_event(event_name, host, location_name, start, description, link = None, verified = False, admin_unit = None, ticket_link=None, photo_res=None, category=None, recurrence_rule=None):
|
||||
if admin_unit is None:
|
||||
admin_unit = get_admin_unit('Stadt Goslar')
|
||||
place = upsert_place(location_name)
|
||||
|
||||
if category is not None:
|
||||
category_object = upsert_event_category(category)
|
||||
else:
|
||||
category_object = upsert_event_category('Other')
|
||||
|
||||
result = Event.query.filter_by(name = event_name).first()
|
||||
if result is None:
|
||||
result = Event()
|
||||
db.session.add(result)
|
||||
|
||||
result.name = event_name
|
||||
result.description = description
|
||||
result.external_link = link
|
||||
result.verified = verified
|
||||
result.admin_unit = admin_unit
|
||||
result.host = host
|
||||
result.place = place
|
||||
result.ticket_link = ticket_link
|
||||
result.category = category_object
|
||||
|
||||
result.recurrence_rule = recurrence_rule
|
||||
update_event_dates_with_recurrence_rule(result, start, None)
|
||||
|
||||
if photo_res is not None:
|
||||
result.photo = upsert_image_with_res(result.photo, photo_res)
|
||||
|
||||
return result
|
||||
|
||||
def get_admin_units_for_organizations():
|
||||
if has_current_user_permission('event:create'):
|
||||
return AdminUnit.query.all()
|
||||
@ -422,6 +380,34 @@ def get_admin_units_for_organizations():
|
||||
def get_admin_units_for_event():
|
||||
return AdminUnit.query.all()
|
||||
|
||||
def get_admin_units_for_manage():
|
||||
# Global admin
|
||||
if current_user.has_role('admin'):
|
||||
return AdminUnit.query.all()
|
||||
|
||||
# Admin unit member permissions (Holger, Artur)
|
||||
admin_units_the_user_is_member_of = admin_units_with_current_user_member_permission('event:verify')
|
||||
|
||||
# Admin org permissions (Marina)
|
||||
admin_units_via_orgs = admin_units_with_current_user_org_member_permission('event:verify', 'event:verify')
|
||||
|
||||
admin_units = admin_units_the_user_is_member_of
|
||||
admin_units.extend(admin_units_via_orgs)
|
||||
|
||||
return admin_units
|
||||
|
||||
def get_admin_unit_for_manage(admin_unit_id):
|
||||
admin_units = get_admin_units_for_manage()
|
||||
return next((au for au in admin_units if au.id == admin_unit_id), None)
|
||||
|
||||
def get_admin_unit_for_manage_or_404(admin_unit_id):
|
||||
admin_unit = get_admin_unit_for_manage(admin_unit_id)
|
||||
|
||||
if not admin_unit:
|
||||
abort(404)
|
||||
|
||||
return admin_unit
|
||||
|
||||
def get_event_hosts():
|
||||
if current_user.is_anonymous:
|
||||
return list()
|
||||
@ -681,6 +667,9 @@ def can_create_organization():
|
||||
def can_update_organization(organization):
|
||||
return can_create_organization()
|
||||
|
||||
def can_update_organizer(organizer):
|
||||
return get_admin_unit_for_manage(organizer.admin_unit_id) is not None
|
||||
|
||||
def can_verify_event(event):
|
||||
if not current_user.is_authenticated:
|
||||
return False
|
||||
@ -702,324 +691,56 @@ def can_verify_event(event):
|
||||
|
||||
return False
|
||||
|
||||
# def can_list_event_suggestion():
|
||||
# return has_current_user_any_permission('event:verify')
|
||||
|
||||
# def can_read_event_suggestion(suggestion):
|
||||
# allowed_admin_units = admin_units_from_aaos(get_event_hosts())
|
||||
# allowed_admin_unit_ids = [a.id for a in allowed_admin_units]
|
||||
|
||||
# return suggestion.admin_unit_id in allowed_admin_unit_ids
|
||||
|
||||
# def get_event_suggestions_for_current_user():
|
||||
# result = list()
|
||||
|
||||
# allowed_admin_units = admin_units_from_aaos(get_event_hosts())
|
||||
# allowed_admin_unit_ids = [a.id for a in allowed_admin_units]
|
||||
|
||||
# suggestions = EventSuggestion.query.all()
|
||||
# for suggestion in suggestions:
|
||||
# if suggestion.admin_unit_id in allowed_admin_unit_ids:
|
||||
# result.append(suggestion)
|
||||
|
||||
# return result
|
||||
def assign_location_values(target, origin):
|
||||
if origin:
|
||||
target.street = origin.street
|
||||
target.postalCode = origin.postalCode
|
||||
target.city = origin.city
|
||||
target.state = origin.state
|
||||
target.country = origin.country
|
||||
target.latitude = origin.latitude
|
||||
target.longitude = origin.longitude
|
||||
|
||||
# Routes
|
||||
|
||||
@app.before_first_request
|
||||
def create_initial_data():
|
||||
return
|
||||
|
||||
# Event categories
|
||||
upsert_event_category('Art')
|
||||
upsert_event_category('Book')
|
||||
upsert_event_category('Movie')
|
||||
upsert_event_category('Family')
|
||||
upsert_event_category('Festival')
|
||||
upsert_event_category('Religious')
|
||||
upsert_event_category('Shopping')
|
||||
upsert_event_category('Comedy')
|
||||
upsert_event_category('Music')
|
||||
upsert_event_category('Dance')
|
||||
upsert_event_category('Nightlife')
|
||||
upsert_event_category('Theater')
|
||||
upsert_event_category('Dining')
|
||||
upsert_event_category('Conference')
|
||||
upsert_event_category('Meetup')
|
||||
upsert_event_category('Fitness')
|
||||
upsert_event_category('Sports')
|
||||
upsert_event_category('Other')
|
||||
db.session.commit()
|
||||
|
||||
# Admin units
|
||||
goslar = upsert_admin_unit('Stadt Goslar', 'goslar')
|
||||
harzburg = upsert_admin_unit('Stadt Bad Harzburg')
|
||||
upsert_admin_unit('Stadt Clausthal')
|
||||
upsert_admin_unit('Gemeinde Walkenried')
|
||||
upsert_admin_unit('Stadt Bad Lauterberg')
|
||||
upsert_admin_unit('Stadt Harzgerode')
|
||||
upsert_admin_unit('Stadt Ilsenburg')
|
||||
upsert_admin_unit('Stadt Osterode')
|
||||
upsert_admin_unit('Stadt Quedlinburg')
|
||||
upsert_admin_unit('Stadt Wernigerode')
|
||||
upsert_admin_unit('Stadt Halberstadt')
|
||||
upsert_admin_unit('Gemeinde Wennigsen')
|
||||
upsert_admin_unit('Stadt Hildesheim')
|
||||
|
||||
# Organizations
|
||||
admin_unit_org_event_verifier_role = upsert_admin_unit_org_role('event_verifier', ['event:verify', "event:create"])
|
||||
gmg = upsert_organization("GOSLAR marketing gmbh", "Markt 7", "38640", "Goslar", url='https://www.goslar.de/kontakt', logo_res="gmg.jpeg")
|
||||
gz = upsert_organization("Goslarsche Zeitung")
|
||||
celtic_inn = upsert_organization("Celtic Inn")
|
||||
kloster_woelteringerode = upsert_organization("Kloster Wöltingerode")
|
||||
miners_rock = upsert_organization("Miner's Rock", "Kuhlenkamp 36", "38640", "Goslar", legal_name="Miner's Rock UG (haftungsbeschränkt)", url="https://www.miners-rock.de/", logo_res="minersrock.jpeg")
|
||||
|
||||
gmg_admin_unit_org = add_organization_to_admin_unit(gmg, goslar)
|
||||
add_role_to_admin_unit_org(gmg_admin_unit_org, admin_unit_org_event_verifier_role)
|
||||
|
||||
gz_admin_unit_org = add_organization_to_admin_unit(gz, goslar)
|
||||
add_role_to_admin_unit_org(gz_admin_unit_org, admin_unit_org_event_verifier_role)
|
||||
|
||||
add_organization_to_admin_unit(celtic_inn, goslar)
|
||||
add_organization_to_admin_unit(miners_rock, goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Aids-Hilfe Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Akademie St. Jakobushaus"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Aktiv für Hahndorf e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Aquantic Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Arbeitsgemeinschaft Hahndorfer Vereine und Verbände"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("attac-Regionalgruppe Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Bildungshaus Zeppelin e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Brauhaus Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Buchhandlung Brumby"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Bühnenreif Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Bürgerstiftung Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Celtic-Inn Irish-Pub im Bahnhof"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Cineplex"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Der Zwinger zu Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("DERPART Reisebüro Goslar GmbH"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Deutscher Alpenverein Sektion Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("DGB - Frauen Goslar in der Region Südniedersachsen/Harz"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("DGB-Kreisvorstand Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Die Butterhanne"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("E-Bike Kasten"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Energie-Forschungszentrum der TU Clausthal - Geschäftsstelle Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("engesser marketing GmbH"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Ev. Kirchengemeinde St. Georg"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Förderkreis Goslarer Kleinkunsttage e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Frankenberger Kirche"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Frankenberger Winterabend"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Frauen-Arbeitsgemeinschaft im Landkreis Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("FreiwilligenAgentur Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Galerie Stoetzel-Tiedt"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Geschichtsverein GS e.V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Gesellschaft der Freunde und Förderer des Internationalen Musikfestes Goslar - Harz e.V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("GOSLAR marketing gmbh"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Goslarer Museum"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Goslarer Theater"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Goslarsche Höfe"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Goslarsche Zeitung"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Große Karnevalsgesellschaft Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Großes Heiliges Kreuz"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Hahndorfer Tennis Club 77 e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("HAHNENKLEE tourismus marketing gmbh"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("HANSA Seniorenzentrum Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Harz Hochzeit"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Hotel Der Achtermann"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Internationale Goslarer Klaviertage "), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Judo-Karate-Club Sportschule Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kloster Wöltingerode Brennen & Brauen GmbH"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Klosterhotel Wöltingerode"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kontaktstelle Musik - Stadtmusikrat Goslar e.V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kreisjugendpflege Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kreismusikschule Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("KUBIK Event- und Musikklub"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kulturgemeinschaft Vienenburg"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Kulturinitiative Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Lions Club Goslar Rammelsberg"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Marketing Club Harz"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Marktkirche Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Media Markt "), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("MGV Juventa von 1877 e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Mönchehaus Museum"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("MTV Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Museumsverein Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("NABU Kreisgruppe Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Naturwissenschaftlicher Verein Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("PT Lounge Christian Brink"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Rampen für Goslar e.V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Residenz Schwiecheldthaus"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Romantik Hotel Alte Münze"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Schiefer"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Schwimmpark Aquantic"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Seniorenvertretung der Stadt Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Soup & Soul Kitchen"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Stadtbibliothek Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Stadtjugendpflege Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Stadtteilverein Jerstedt e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Stiftung \"Maria in Horto\""), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Verlag Goslarsche Zeitung"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Vienenburger Bürgerverein e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Volksfest Goslar e. V."), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Weltkulturerbe Rammelsberg"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Zinnfigurenmuseum Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Zonta Club Goslar"), goslar)
|
||||
add_organization_to_admin_unit(upsert_organization("Zontaclub Goslar St. Barbar"), goslar)
|
||||
|
||||
# Places
|
||||
upsert_place('Vienenburger See', 'In der Siedlung 4', '38690', 'Goslar', 51.958375, 10.559621)
|
||||
upsert_place('Feuerwehrhaus Hahndorf')
|
||||
upsert_place('Gemeindehaus St. Kilian Hahndorf')
|
||||
upsert_place('Grundschule Hahndorf')
|
||||
upsert_place('Mehrzweckhalle Hahndorf')
|
||||
upsert_place('Sportplatz Hahndorf')
|
||||
upsert_place('St. Kilian Hahndorf')
|
||||
upsert_place("Tourist-Information Goslar", 'Markt 7', '38644', 'Goslar', 51.906172, 10.429346, 'http://www.goslar.de/kontakt', "Zentral am Marktplatz gelegen, ist die Tourist-Information die erste Anlaufstelle für Goslar-Besucher. 14 motivierte und serviceorientierte Mitarbeiter sorgen dafür, dass sich der Gast rundherum wohl fühlt. Die ständige Qualitätsverbesserung und der flexible Umgang mit den Kundenwünschen sind Teil unserer Leitsätze.", 'touristinfo.jpeg')
|
||||
upsert_place("Nagelkopf am Rathaus Goslar", 'Marktkirchhof 3', '38640', 'Goslar', 51.9055939, 10.4263286)
|
||||
upsert_place("Kloster Wöltingerode", 'Wöltingerode 3', '38690', 'Goslar', 51.9591156, 10.5371815)
|
||||
upsert_place("Marktplatz Goslar", 'Markt 6', '38640', 'Goslar', 51.9063601, 10.4249433)
|
||||
upsert_place("Burg Vienenburg", 'Burgweg 2', '38690', 'Goslar', 51.9476558, 10.5617368)
|
||||
upsert_place("Kurhaus Bad Harzburg", 'Kurhausstraße 11', '38667', 'Bad Harzburg', 51.8758165, 10.5593392)
|
||||
upsert_place("Goslarsche Höfe", 'Okerstraße 32', '38640', 'Goslar', 51.911571, 10.4391331, 'https://www.goslarsche-hoefe.de/')
|
||||
upsert_place("Schlosserei im Rammelsberg", 'Bergtal 19', '38640', 'Goslar', 51.890527, 10.418880, 'http://www.rammelsberg.de/', 'Die "Schlosserei" ist erprobter Veranstaltungsort und bietet Platz für ca. 700 Besucher. Das Ambiente ist technisch gut ausgestattet und flexibel genug, für jeden Künstler individuell wandelbar zu sein. Dabei lebt nicht nur der Veranstaltungsraum, es wirkt der gesamte Komplex des Rammelsberges und macht den Besuch zu einem unvergeßlichen Erlebnis.', photo_res="schlosserei.jpeg")
|
||||
|
||||
# Org or admins
|
||||
goslar_ooa = upsert_org_or_admin_unit_for_admin_unit(goslar)
|
||||
kloster_woelteringerode_ooa = upsert_org_or_admin_unit_for_organization(kloster_woelteringerode)
|
||||
gmg_ooa = upsert_org_or_admin_unit_for_organization(gmg)
|
||||
harzburg_ooa = upsert_org_or_admin_unit_for_admin_unit(harzburg)
|
||||
|
||||
# Commit
|
||||
db.session.commit()
|
||||
|
||||
# Users
|
||||
admin_role = user_datastore.find_or_create_role("admin")
|
||||
admin_role.add_permissions(["user:create",
|
||||
"event:verify",
|
||||
"event:create",
|
||||
"event_suggestion:read",
|
||||
"admin_unit:update",
|
||||
"admin_unit.members:read",
|
||||
"organization.members:read"])
|
||||
|
||||
admin_unit_admin_role = upsert_admin_unit_member_role('admin', ["admin_unit.members:read", "admin_unit.organizations.members:read"])
|
||||
admin_unit_event_verifier_role = upsert_admin_unit_member_role('event_verifier', ["event:verify", "event:create", "event_suggestion:read"])
|
||||
org_member_event_verifier_role = upsert_org_member_role('event_verifier', ["event:verify", "event:create", "event_suggestion:read"])
|
||||
org_member_event_creator_role = upsert_org_member_role('event_creator', ["event:create"])
|
||||
|
||||
daniel = upsert_user("grams.daniel@gmail.com")
|
||||
user_datastore.add_role_to_user(daniel, admin_role)
|
||||
|
||||
holger = upsert_user("holger@test.de")
|
||||
holger_goslar_member = add_user_to_admin_unit(holger, goslar)
|
||||
add_role_to_admin_unit_member(holger_goslar_member, admin_unit_admin_role)
|
||||
add_role_to_admin_unit_member(holger_goslar_member, admin_unit_event_verifier_role)
|
||||
|
||||
artur = upsert_user("artur@test.de")
|
||||
artur_goslar_member = add_user_to_admin_unit(artur, goslar)
|
||||
add_role_to_admin_unit_member(artur_goslar_member, admin_unit_event_verifier_role)
|
||||
|
||||
mia = upsert_user("mia@test.de")
|
||||
mia_gmg_member = add_user_to_organization(mia, gmg)
|
||||
add_role_to_org_member(mia_gmg_member, org_member_event_verifier_role)
|
||||
|
||||
marina_vetter = upsert_user("marina.vetter@goslar.de")
|
||||
marina_vetter_gmg_member = add_user_to_organization(marina_vetter, gmg)
|
||||
add_role_to_org_member(marina_vetter_gmg_member, org_member_event_verifier_role)
|
||||
|
||||
tom = upsert_user("tom@test.de")
|
||||
tom_gz_member = add_user_to_organization(tom, gz)
|
||||
add_role_to_org_member(tom_gz_member, org_member_event_verifier_role)
|
||||
|
||||
jason = upsert_user("jason@test.de")
|
||||
jason_celtic_inn_member = add_user_to_organization(jason, celtic_inn)
|
||||
add_role_to_org_member(jason_celtic_inn_member, org_member_event_creator_role)
|
||||
|
||||
grzno = upsert_user("grzno@test.de")
|
||||
grzno_miners_rock_member = add_user_to_organization(grzno, miners_rock)
|
||||
add_role_to_org_member(grzno_miners_rock_member, org_member_event_creator_role)
|
||||
|
||||
# Events
|
||||
upsert_event("Vienenburger Seefest",
|
||||
goslar_ooa,
|
||||
"Vienenburger See",
|
||||
create_berlin_date(2020, 8, 14, 17, 0),
|
||||
'Vom 14. bis 16. August 2020 findet im ausgewiesenen Naherholungsgebiet am Fuße des Harzes, dem Goslarer Ortsteil Vienenburg, das Seefest unter dem Motto „Feuer & Wasser“ statt.',
|
||||
'https://www.goslar.de/kultur-freizeit/veranstaltungen/156-vienenburger-seefest?layout=*',
|
||||
True)
|
||||
|
||||
upsert_event("Tausend Schritte durch die Altstadt",
|
||||
gmg_ooa,
|
||||
"Tourist-Information Goslar",
|
||||
create_berlin_date(2020, 1, 2, 10, 0),
|
||||
'Erleben Sie einen geführten Stadtrundgang durch den historischen Stadtkern. Lassen Sie sich von Fachwerkromantik und kaiserlichen Bauten inmitten der UNESCO-Welterbestätte verzaubern. ganzjährig (außer 01.01.) täglich 10:00 Uhr Treffpunkt: Tourist-Information am Marktplatz (Dauer ca. 2 Std.) Erwachsene 8,00 Euro Inhaber Gastkarte Goslar/Kurkarte Hahnenklee 7,00 Euro Schüler/Studenten 6,00 Euro',
|
||||
photo_res="tausend.jpeg",
|
||||
recurrence_rule="RRULE:FREQ=DAILY;UNTIL=20201231T235959")
|
||||
|
||||
upsert_event("Spaziergang am Nachmittag",
|
||||
gmg_ooa,
|
||||
"Tourist-Information Goslar",
|
||||
create_berlin_date(2020, 4, 1, 13, 30),
|
||||
'Begeben Sie sich auf einen geführten Rundgang durch die historische Altstadt. Entdecken Sie malerische Fachwerkgassen und imposante Bauwerke bei einem Streifzug durch das UNESCO-Weltkulturerbe. April – Oktober und 25.11. – 30.12. Montag – Samstag 13:30 Uhr Treffpunkt: Tourist-Information am Marktplatz (Dauer ca. 1,5 Std.) Erwachsene 7,00 Euro Inhaber Gastkarte Goslar/Kurkarte Hahnenklee 6,00 Euro Schüler/Studenten 5,00 Euro',
|
||||
photo_res="nachmittag.jpeg",
|
||||
recurrence_rule="""RRULE:FREQ=WEEKLY;UNTIL=20201031T235959;BYDAY=MO,TU,WE,TH,FR,SA""")
|
||||
|
||||
upsert_event("Ein Blick hinter die Kulissen - Rathausbaustelle",
|
||||
goslar_ooa,
|
||||
"Nagelkopf am Rathaus Goslar",
|
||||
create_berlin_date(2020, 9, 3, 17, 0),
|
||||
'Allen interessierten Bürgern wird die Möglichkeit geboten, unter fachkundiger Führung des Goslarer Gebäudemanagement (GGM) einen Blick hinter die Kulissen durch das derzeit gesperrte historische Rathaus und die Baustelle Kulturmarktplatz zu werfen. Da bei beiden Führungen die Anzahl der Teilnehmer auf 16 Personen begrenzt ist, ist eine Anmeldung unbedingt notwendig sowie festes Schuhhwerk. Bitte melden Sie sich bei Interesse in der Tourist-Information (Tel. 05321-78060) an. Kinder unter 18 Jahren sind aus Sicherheitsgründen auf der Baustelle nicht zugelassen.')
|
||||
|
||||
upsert_event("Wöltingerode unter Dampf",
|
||||
kloster_woelteringerode_ooa,
|
||||
"Kloster Wöltingerode",
|
||||
create_berlin_date(2020, 9, 5, 12, 0),
|
||||
'Mit einem ländlichen Programm rund um historische Trecker und Landmaschinen, köstliche Produkte aus Brennerei und Region, einem Kunsthandwerkermarkt und besonderen Führungen findet das Hoffest auf dem Klostergut statt.',
|
||||
'https://www.woelti-unter-dampf.de')
|
||||
|
||||
upsert_event("Altstadtfest",
|
||||
gmg_ooa,
|
||||
"Marktplatz Goslar",
|
||||
create_berlin_date(2020, 9, 11, 15, 0),
|
||||
'Drei Tage lang dürfen sich die Besucher des Goslarer Altstadtfestes auf ein unterhaltsames und abwechslungsreiches Veranstaltungsprogramm freuen. Der Flohmarkt auf der Kaiserpfalzwiese lädt zum Stöbern vor historischer Kulisse ein.',
|
||||
'https://www.goslar.de/kultur-freizeit/veranstaltungen/altstadtfest')
|
||||
|
||||
upsert_event("Adventsmarkt auf der Vienenburg",
|
||||
goslar_ooa,
|
||||
"Burg Vienenburg",
|
||||
create_berlin_date(2020, 12, 13, 12, 0),
|
||||
'Inmitten der mittelalterlichen Burg mit dem restaurierten Burgfried findet der „Advent auf der Burg“ statt. Der Adventsmarkt wird von gemeinnützigen und sozialen Vereinen sowie den Kirchen ausgerichtet.')
|
||||
|
||||
# upsert_event_suggestion("Der Blaue Vogel",
|
||||
# "Freese-Baus Ballettschule",
|
||||
# "Kurhaus Bad Harzburg",
|
||||
# create_berlin_date(2020, 9, 12, 16, 0),
|
||||
# 'Die Freese-Baus Ballettschule zeigt 2020 ein wenig bekanntes französisches Märchen nach einer Erzählung Maurice Maeterlinck. Die Leiterin der Schule, Hanna-Sibylle Werner, hat die Grundidee übernommen, aber für ein Ballett überarbeitet, verändert und einstudiert. Das Märchen handelt von zwei Mädchen, die einen kleinen blauen Vogel lieb gewonnen haben, der über Nacht verschwunden ist. Mit Hilfe der Berylune und der Fee des Lichts machen sie sich auf den Weg, den Vogel wieder zu finden. Ihre Reise führt sie ins Reich der Erinnerung, des Glücks, der Phantasie und der Elemente. ( Die Einstudierung der Elemente: Luft, Wasser, Feuer übernahm der Choreograf Marco Barbieri, der auch zum Team der Ballettschule gehört ). Im Reich der Königin der Nacht finden sie ihren kleinen Vogel wieder, aber ob sie ihn mit nehmen dürfen, wird nicht verraten. Die Aufführungen werden durch farbenfrohe Kostüme ( Eigentum der Schule ) und Bühnenbilder ( Günter Werner ) ergänzt. Die Musik stammt von verschiedenen Komponisten. Die Tänzer*innen sind im Alter von 3 bis 40 Jahren, die Teilnahme ist für die älteren Schüler*innen freiwillig.',
|
||||
# 'https://veranstaltungen.meinestadt.de/bad-harzburg/event-detail/35486361/98831674',
|
||||
# admin_unit = get_admin_unit('Stadt Bad Harzburg'))
|
||||
|
||||
# upsert_event_suggestion("Herbst-Flohmarkt",
|
||||
# "Goslarsche Höfe - Integrationsbetrieb - gGmbH",
|
||||
# "Goslarsche Höfe",
|
||||
# create_berlin_date(2020, 10, 10, 10, 0),
|
||||
# 'Zum letzten Mal in dieser Saison gibt es einen Hof-Flohmarkt. Wir bieten zwar nicht den größten, aber vielleicht den gemütlichsten Flohmarkt in der Region. Frei von gewerblichen Anbietern, dafür mit Kaffee, Kuchen, Bier und Bratwurst, alles auf unserem schönen Hofgelände.',
|
||||
# 'https://www.goslarsche-hoefe.de/veranstaltungen/10/2175252/2020/10/10/herbst-flohmarkt.html')
|
||||
|
||||
upsert_event('"MINER\'S ROCK" Schickt XVI - Lotte',
|
||||
miners_rock.org_or_adminunit,
|
||||
"Schlosserei im Rammelsberg",
|
||||
create_berlin_date(2020, 10, 31, 19, 0),
|
||||
'Auch im Jahr 2020 wagt sich das MINER’S ROCK wieder an eine Doppel-Schicht. LOTTE wird bei uns das Wochenende am Berg abrunden! Nach der bereits ausverkauften Schicht am 30. Oktober mit Subway to Sally, wird Lotte den Samstagabend zu einem Pop-Erlebnis machen.\nAb Anfang Februar ist sie in den Konzerthallen in Deutschland unterwegs und wird ihr neues Album „Glück“ vorstellen. Glück ist der langersehnte Nachfolger von LOTTEs Debütalbum „Querfeldein". Mit Songs wie der ersten Single „Schau mich nicht so an" oder dem Duett mit Max Giesinger „Auf das was da noch kommt“, durchmisst LOTTE dabei die Höhen und Tiefen des menschlichen Glücksstrebens. Und auch wenn jeder der zwölf Songs seine eigene Geschichte erzählt – sie alle eint die Suche nach der ganz persönlichen Bedeutung dieses großen Wortes. Glück ist kein Werk über einen abgeschlossenen Prozess, sondern ein beeindruckend ehrliches und facettenreiches Album über eine menschliche Suche. „Auf das was da noch kommt“ läuft derzeit in den Radiostationen auf und ab und macht einfach Spaß.\n\nWichtig zu wissen:\n\nEinlass: 19:00 Uhr\nBeginn des Musikprogramms: 20:00 Uhr\nTickets gibt es ab sofort im Shop des MINER‘S ROCK unter www.miners-rock.de und in den Geschäftsstellen der Goslarschen Zeitung.',
|
||||
'https://www.miners-rock.de/xvi-lotte',
|
||||
ticket_link='https://www.regiolights.de/tickets/product/schicht-xvi-lotte',
|
||||
photo_res="lotte.jpeg",
|
||||
category='Music')
|
||||
|
||||
db.session.commit()
|
||||
|
||||
events = Event.query.filter_by(start = None).all()
|
||||
events = Event.query.all()
|
||||
for event in events:
|
||||
event.start = event.dates[0].start
|
||||
event.end = event.dates[0].end
|
||||
if not event.organizer:
|
||||
ooa = event.host.organization if event.host.organization else event.host.admin_unit
|
||||
event.organizer = upsert_event_organizer(event.admin_unit_id, ooa.name)
|
||||
event.organizer.name = ooa.name
|
||||
event.organizer.url = ooa.url
|
||||
event.organizer.email = ooa.email
|
||||
event.organizer.phone = ooa.phone
|
||||
event.organizer.fax = ooa.fax
|
||||
event.organizer.logo = ooa.logo
|
||||
|
||||
if not event.organizer.location and ooa.location:
|
||||
event.organizer.location = Location()
|
||||
assign_location_values(event.organizer.location, ooa.location)
|
||||
|
||||
event.organizer.adminunit = event.admin_unit
|
||||
|
||||
if not event.event_place:
|
||||
event.event_place = upsert_event_place(event.admin_unit_id, event.organizer_id, event.place.name)
|
||||
event.event_place.url = event.place.url
|
||||
event.event_place.photo = event.place.photo
|
||||
event.event_place.description = event.place.description
|
||||
|
||||
if not event.event_place.location and event.place.location:
|
||||
event.event_place.location.location = Location()
|
||||
assign_location_values(event.event_place.location, event.place.location)
|
||||
|
||||
event.event_place.adminunit = event.admin_unit
|
||||
event.event_place.eventorganizer = event.organizer
|
||||
event.event_place.public = True
|
||||
|
||||
organizers = EventOrganizer.query.all()
|
||||
for organizer in organizers:
|
||||
if not organizer.name:
|
||||
organizer.name = organizer.org_name
|
||||
|
||||
db.session.commit()
|
||||
|
||||
@ -1081,6 +802,7 @@ def admin_unit_update(admin_unit_id):
|
||||
flash(gettext('Admin unit successfully updated'), 'success')
|
||||
return redirect(url_for('admin_unit', admin_unit_id=admin_unit.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
|
||||
return render_template('admin_unit/update.html',
|
||||
@ -1138,6 +860,7 @@ def organization_create():
|
||||
flash(gettext('Organization successfully created'), 'success')
|
||||
return redirect(url_for('organization', organization_id=organization.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
return render_template('organization/create.html', form=form)
|
||||
|
||||
@ -1158,6 +881,7 @@ def organization_update(organization_id):
|
||||
flash(gettext('Organization successfully updated'), 'success')
|
||||
return redirect(url_for('organization', organization_id=organization.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
|
||||
return render_template('organization/update.html',
|
||||
@ -1217,6 +941,7 @@ def place_update(place_id):
|
||||
flash(gettext('Place successfully updated'), 'success')
|
||||
return redirect(url_for('place', place_id=place.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
|
||||
return render_template('place/update.html',
|
||||
@ -1240,6 +965,7 @@ def place_create():
|
||||
flash(gettext('Place successfully created'), 'success')
|
||||
return redirect(url_for('place', place_id=place.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
return render_template('place/create.html', form=form)
|
||||
|
||||
@ -1300,9 +1026,9 @@ def api_events():
|
||||
return jsonify(result)
|
||||
|
||||
from forms.event import CreateEventForm, UpdateEventForm, DeleteEventForm
|
||||
from forms.event_suggestion import CreateEventSuggestionForm
|
||||
from forms.place import CreatePlaceForm, UpdatePlaceForm
|
||||
from forms.organization import CreateOrganizationForm, UpdateOrganizationForm
|
||||
from forms.organizer import CreateOrganizerForm, UpdateOrganizerForm, DeleteOrganizerForm
|
||||
from forms.admin_unit import CreateAdminUnitForm, UpdateAdminUnitForm
|
||||
|
||||
def update_event_with_form(event, form):
|
||||
@ -1321,22 +1047,18 @@ def update_event_with_form(event, form):
|
||||
event.photo = upsert_image_with_data(event.photo, fs.read(), fs.content_type)
|
||||
|
||||
def prepare_event_form(form):
|
||||
form.host_id.choices = sorted([(ooa.id, ooa.organization.name if ooa.organization is not None else ooa.admin_unit.name) for ooa in get_event_hosts()], key=lambda ooa: ooa[1])
|
||||
form.organizer_id.choices = [(o.id, o.name) for o in EventOrganizer.query.filter(EventOrganizer.admin_unit_id == form.admin_unit_id.data).order_by(func.lower(EventOrganizer.name))]
|
||||
form.place_id.choices = [(p.id, p.name) for p in Place.query.order_by('name')]
|
||||
form.category_id.choices = sorted([(c.id, get_event_category_name(c)) for c in EventCategory.query.all()], key=lambda ooa: ooa[1])
|
||||
form.admin_unit_id.choices = sorted([(admin_unit.id, admin_unit.name) for admin_unit in get_admin_units_for_event()], key=lambda admin_unit: admin_unit[1])
|
||||
|
||||
form.host_id.choices.insert(0, (0, ''))
|
||||
form.organizer_id.choices.insert(0, (0, ''))
|
||||
form.place_id.choices.insert(0, (0, ''))
|
||||
|
||||
def event_create_base(admin_unit = None):
|
||||
form = CreateEventForm(category_id=upsert_event_category('Other').id)
|
||||
def event_create_base(admin_unit, organizer_id=0):
|
||||
form = CreateEventForm(admin_unit_id=admin_unit.id, organizer_id=organizer_id, category_id=upsert_event_category('Other').id)
|
||||
prepare_event_form(form)
|
||||
|
||||
if admin_unit:
|
||||
form.admin_unit_id.data = admin_unit.id
|
||||
form.admin_unit_is_readonly = True
|
||||
|
||||
if form.validate_on_submit():
|
||||
event = Event()
|
||||
update_event_with_form(event, form)
|
||||
@ -1347,20 +1069,23 @@ def event_create_base(admin_unit = None):
|
||||
flash(gettext('Event successfully created'), 'success')
|
||||
return redirect(url_for('event', event_id=event.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
else:
|
||||
flash_errors(form)
|
||||
return render_template('event/create.html', form=form)
|
||||
|
||||
@app.route("/events/create", methods=('GET', 'POST'))
|
||||
def event_create():
|
||||
return event_create_base()
|
||||
|
||||
@app.route("/<string:au_short_name>/events/create", methods=('GET', 'POST'))
|
||||
def event_create_for_admin_unit(au_short_name):
|
||||
admin_unit = AdminUnit.query.filter(AdminUnit.short_name == au_short_name).first_or_404()
|
||||
return event_create_base(admin_unit)
|
||||
|
||||
@app.route("/admin_unit/<int:id>/events/create", methods=('GET', 'POST'))
|
||||
def event_create_for_admin_unit_id(id):
|
||||
admin_unit = AdminUnit.query.get_or_404(id)
|
||||
organizer_id = request.args.get('organizer_id') if 'organizer_id' in request.args else 0
|
||||
return event_create_base(admin_unit, organizer_id)
|
||||
|
||||
@app.route('/event/<int:event_id>/update', methods=('GET', 'POST'))
|
||||
def event_update(event_id):
|
||||
event = Event.query.get_or_404(event_id)
|
||||
@ -1379,6 +1104,7 @@ def event_update(event_id):
|
||||
flash(gettext('Event successfully updated'), 'success')
|
||||
return redirect(url_for('event', event_id=event.id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
else:
|
||||
flash_errors(form)
|
||||
@ -1406,6 +1132,7 @@ def event_delete(event_id):
|
||||
flash(gettext('Event successfully deleted'), 'success')
|
||||
return redirect(url_for('events'))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
else:
|
||||
flash_errors(form)
|
||||
@ -1429,38 +1156,6 @@ def event_rrule():
|
||||
result = calculate_occurrences(start_date, '"%d.%m.%Y"', rrule_str, start, batch_size)
|
||||
return jsonify(result)
|
||||
|
||||
# @app.route("/eventsuggestions")
|
||||
# @auth_required()
|
||||
# def eventsuggestions():
|
||||
# if not can_list_event_suggestion():
|
||||
# abort(401)
|
||||
|
||||
# return render_template('event_suggestion/list.html',
|
||||
# suggestions=get_event_suggestions_for_current_user())
|
||||
|
||||
# @app.route('/eventsuggestion/<int:event_suggestion_id>')
|
||||
# @auth_required()
|
||||
# def eventsuggestion(event_suggestion_id):
|
||||
# suggestion = EventSuggestion.query.filter_by(id = event_suggestion_id).first()
|
||||
# if not can_read_event_suggestion(suggestion):
|
||||
# abort(401)
|
||||
|
||||
# return render_template('event_suggestion/read.html', suggestion=suggestion)
|
||||
|
||||
# @app.route("/eventsuggestions/create", methods=('GET', 'POST'))
|
||||
# def event_suggestion_create():
|
||||
# form = CreateEventSuggestionForm()
|
||||
# if form.validate_on_submit():
|
||||
# event = EventSuggestion()
|
||||
# form.populate_obj(event)
|
||||
# event.admin_unit = get_admin_unit('Stadt Goslar')
|
||||
# eventDate = EventSuggestionDate(event_suggestion_id = event.id, start=form.start.data)
|
||||
# event.dates.append(eventDate)
|
||||
# db.session.commit()
|
||||
# flash(gettext('Event suggestion successfully created'), 'success')
|
||||
# return redirect(url_for('home'))
|
||||
# return render_template('event_suggestion/create.html', form=form)
|
||||
|
||||
@app.route("/admin")
|
||||
@roles_required("admin")
|
||||
def admin():
|
||||
@ -1472,6 +1167,125 @@ def admin_admin_units():
|
||||
return render_template('admin/admin_units.html',
|
||||
admin_units=AdminUnit.query.all())
|
||||
|
||||
@app.route("/manage")
|
||||
def manage():
|
||||
admin_units = get_admin_units_for_manage()
|
||||
|
||||
if len(admin_units) == 1:
|
||||
return redirect(url_for('manage_admin_unit', id=admin_units[0].id))
|
||||
|
||||
return render_template('manage/admin_units.html',
|
||||
admin_units=admin_units)
|
||||
|
||||
@app.route('/manage/admin_unit/<int:id>')
|
||||
def manage_admin_unit(id):
|
||||
admin_unit = get_admin_unit_for_manage_or_404(id)
|
||||
|
||||
return redirect(url_for('manage_admin_unit_organizers', id=admin_unit.id))
|
||||
|
||||
return render_template('manage/admin_unit.html',
|
||||
admin_unit=admin_unit)
|
||||
|
||||
@app.route('/manage/admin_unit/<int:id>/organizers')
|
||||
def manage_admin_unit_organizers(id):
|
||||
admin_unit = get_admin_unit_for_manage_or_404(id)
|
||||
organizers = EventOrganizer.query.filter(EventOrganizer.admin_unit_id == admin_unit.id).order_by(func.lower(EventOrganizer.name)).all()
|
||||
|
||||
return render_template('manage/organizers.html',
|
||||
admin_unit=admin_unit,
|
||||
organizers=organizers)
|
||||
|
||||
@app.route('/organizer/<int:id>')
|
||||
def organizer(id):
|
||||
organizer = EventOrganizer.query.get_or_404(id)
|
||||
|
||||
return render_template('organizer/read.html',
|
||||
organizer=organizer,
|
||||
can_update_organizer=can_update_organizer(organizer))
|
||||
|
||||
def update_organizer_with_form(organizer, form):
|
||||
form.populate_obj(organizer)
|
||||
|
||||
if form.logo_file.data:
|
||||
fs = form.logo_file.data
|
||||
organizer.logo = upsert_image_with_data(organizer.logo, fs.read(), fs.content_type)
|
||||
|
||||
@app.route('/manage/admin_unit/<int:id>/organizers/create', methods=('GET', 'POST'))
|
||||
def manage_admin_unit_organizer_create(id):
|
||||
admin_unit = get_admin_unit_for_manage_or_404(id)
|
||||
|
||||
form = CreateOrganizerForm()
|
||||
|
||||
if form.validate_on_submit():
|
||||
organizer = EventOrganizer()
|
||||
organizer.admin_unit_id = admin_unit.id
|
||||
organizer.location = Location()
|
||||
update_organizer_with_form(organizer, form)
|
||||
|
||||
try:
|
||||
db.session.add(organizer)
|
||||
db.session.commit()
|
||||
flash(gettext('Organizer successfully created'), 'success')
|
||||
#return redirect(url_for('organizer', id=organizer.id))
|
||||
return redirect(url_for('manage_admin_unit_organizers', id=organizer.admin_unit_id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
return render_template('organizer/create.html', form=form)
|
||||
|
||||
@app.route('/organizer/<int:id>/update', methods=('GET', 'POST'))
|
||||
def organizer_update(id):
|
||||
organizer = EventOrganizer.query.get_or_404(id)
|
||||
|
||||
if not can_update_organizer(organizer):
|
||||
abort(401)
|
||||
|
||||
form = UpdateOrganizerForm(obj=organizer)
|
||||
|
||||
if form.validate_on_submit():
|
||||
update_organizer_with_form(organizer, form)
|
||||
|
||||
try:
|
||||
db.session.commit()
|
||||
flash(gettext('Organizer successfully updated'), 'success')
|
||||
#return redirect(url_for('organizer', id=organizer.id))
|
||||
return redirect(url_for('manage_admin_unit_organizers', id=organizer.admin_unit_id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
|
||||
return render_template('organizer/update.html',
|
||||
form=form,
|
||||
organizer=organizer)
|
||||
|
||||
@app.route('/organizer/<int:id>/delete', methods=('GET', 'POST'))
|
||||
def organizer_delete(id):
|
||||
organizer = EventOrganizer.query.get_or_404(id)
|
||||
|
||||
if not can_update_organizer(organizer):
|
||||
abort(401)
|
||||
|
||||
form = DeleteOrganizerForm()
|
||||
|
||||
if form.validate_on_submit():
|
||||
if form.name.data != organizer.name:
|
||||
flash(gettext('Entered name does not match organizer name'), 'danger')
|
||||
else:
|
||||
try:
|
||||
db.session.delete(organizer)
|
||||
db.session.commit()
|
||||
flash(gettext('Organizer successfully deleted'), 'success')
|
||||
return redirect(url_for('manage_admin_unit_organizers', id=organizer.admin_unit_id))
|
||||
except SQLAlchemyError as e:
|
||||
db.session.rollback()
|
||||
flash(handleSqlError(e), 'danger')
|
||||
else:
|
||||
flash_errors(form)
|
||||
|
||||
return render_template('organizer/delete.html',
|
||||
form=form,
|
||||
organizer=organizer)
|
||||
|
||||
def date_add_time(date, hour=0, minute=0, second=0, tzinfo=None):
|
||||
return datetime(date.year, date.month, date.day, hour=hour, minute=minute, second=second, tzinfo=tzinfo)
|
||||
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
from flask_babelex import lazy_gettext, gettext
|
||||
from flask_wtf import FlaskForm
|
||||
from flask_wtf.file import FileField, FileAllowed
|
||||
from wtforms import DateTimeField, StringField, SubmitField, TextAreaField, SelectField, BooleanField, IntegerField, FormField
|
||||
from wtforms import RadioField, DateTimeField, StringField, SubmitField, TextAreaField, SelectField, BooleanField, IntegerField, FormField
|
||||
from wtforms.fields.html5 import DateTimeLocalField, EmailField
|
||||
from wtforms.validators import DataRequired, Optional
|
||||
from wtforms.widgets import html_params, HTMLString
|
||||
@ -25,7 +25,6 @@ class EventPlaceForm(FlaskForm):
|
||||
|
||||
class EventOrganizerForm(FlaskForm):
|
||||
name = StringField(lazy_gettext('Organizator'), validators=[Optional()])
|
||||
org_name = StringField(lazy_gettext('Organization'), validators=[Optional()])
|
||||
url = StringField(lazy_gettext('Link URL'), validators=[Optional()])
|
||||
email = EmailField(lazy_gettext('Email'), validators=[Optional()])
|
||||
phone = StringField(lazy_gettext('Phone'), validators=[Optional()])
|
||||
@ -43,14 +42,12 @@ class CreateEventForm(FlaskForm):
|
||||
previous_start_date = CustomDateTimeField(lazy_gettext('Previous start date'), validators=[Optional()])
|
||||
tags = StringField(lazy_gettext('Tags'), validators=[Optional()])
|
||||
|
||||
organizer = FormField(EventOrganizerForm, default=lambda: EventOrganizer())
|
||||
event_place = FormField(EventPlaceForm, default=lambda: EventPlace())
|
||||
|
||||
organizer_id = SelectField(lazy_gettext('Organizer'), validators=[DataRequired()], coerce=int)
|
||||
place_id = SelectField(lazy_gettext('Existing place'), validators=[Optional()], coerce=int)
|
||||
host_id = SelectField(lazy_gettext('Host'), validators=[Optional()], coerce=int)
|
||||
category_id = SelectField(lazy_gettext('Category'), validators=[DataRequired()], coerce=int)
|
||||
admin_unit_id = SelectField(lazy_gettext('Admin unit'), validators=[DataRequired()], coerce=int)
|
||||
admin_unit_is_readonly = False
|
||||
|
||||
kid_friendly = BooleanField(lazy_gettext('Kid friendly'), validators=[Optional()])
|
||||
accessible_for_free = BooleanField(lazy_gettext('Accessible for free'), validators=[Optional()])
|
||||
@ -67,19 +64,10 @@ class CreateEventForm(FlaskForm):
|
||||
(int(EventAttendanceMode.online), lazy_gettext('EventAttendanceMode.online')),
|
||||
(int(EventAttendanceMode.mixed), lazy_gettext('EventAttendanceMode.mixed'))])
|
||||
|
||||
status = SelectField(lazy_gettext('Status'), coerce=int, choices=[
|
||||
(int(EventStatus.scheduled), lazy_gettext('EventStatus.scheduled')),
|
||||
(int(EventStatus.cancelled), lazy_gettext('EventStatus.cancelled')),
|
||||
(int(EventStatus.movedOnline), lazy_gettext('EventStatus.movedOnline')),
|
||||
(int(EventStatus.postponed), lazy_gettext('EventStatus.postponed')),
|
||||
(int(EventStatus.rescheduled), lazy_gettext('EventStatus.rescheduled'))])
|
||||
|
||||
photo_file = FileField(lazy_gettext('Photo'), validators=[FileAllowed(['jpg', 'jpeg', 'png'], lazy_gettext('Images only!'))])
|
||||
|
||||
def populate_obj(self, obj):
|
||||
for name, field in self._fields.items():
|
||||
if name == 'organizer' and not obj.organizer:
|
||||
obj.organizer = EventOrganizer()
|
||||
if name == 'event_place' and not obj.event_place:
|
||||
obj.event_place = EventPlace()
|
||||
field.populate_obj(obj, name)
|
||||
@ -87,12 +75,6 @@ class CreateEventForm(FlaskForm):
|
||||
def validate(self):
|
||||
if not super(CreateEventForm, self).validate():
|
||||
return False
|
||||
if self.host_id.data == 0 and not self.organizer.form.name.data and not self.organizer.form.org_name.data:
|
||||
msg = gettext('Select existing host or enter organizer')
|
||||
self.host_id.errors.append(msg)
|
||||
self.organizer.form.name.errors.append(msg)
|
||||
self.organizer.form.org_name.errors.append(msg)
|
||||
return False
|
||||
if self.place_id.data == 0 and not self.event_place.form.name.data:
|
||||
msg = gettext('Select existing place or enter new place')
|
||||
self.place_id.errors.append(msg)
|
||||
@ -101,6 +83,13 @@ class CreateEventForm(FlaskForm):
|
||||
return True
|
||||
|
||||
class UpdateEventForm(CreateEventForm):
|
||||
status = SelectField(lazy_gettext('Status'), coerce=int, choices=[
|
||||
(int(EventStatus.scheduled), lazy_gettext('EventStatus.scheduled')),
|
||||
(int(EventStatus.cancelled), lazy_gettext('EventStatus.cancelled')),
|
||||
(int(EventStatus.movedOnline), lazy_gettext('EventStatus.movedOnline')),
|
||||
(int(EventStatus.postponed), lazy_gettext('EventStatus.postponed')),
|
||||
(int(EventStatus.rescheduled), lazy_gettext('EventStatus.rescheduled'))])
|
||||
|
||||
submit = SubmitField(lazy_gettext("Update event"))
|
||||
|
||||
class DeleteEventForm(FlaskForm):
|
||||
|
||||
@ -1,22 +0,0 @@
|
||||
from flask_babelex import lazy_gettext
|
||||
from flask_wtf import FlaskForm
|
||||
from wtforms import StringField, SubmitField, TextAreaField
|
||||
from wtforms.fields.html5 import DateTimeLocalField, EmailField
|
||||
from wtforms.validators import DataRequired, Optional
|
||||
from .widgets import CustomDateTimeField
|
||||
|
||||
class CreateEventSuggestionForm(FlaskForm):
|
||||
submit = SubmitField(lazy_gettext("Suggest event"))
|
||||
event_name = StringField(lazy_gettext('Name'), validators=[DataRequired()])
|
||||
description = TextAreaField(lazy_gettext('Description'), validators=[DataRequired()])
|
||||
start = CustomDateTimeField(lazy_gettext('Start'), validators=[DataRequired()])
|
||||
external_link = StringField(lazy_gettext('Link URL'), validators=[Optional()])
|
||||
|
||||
place_name = StringField(lazy_gettext('Event place'), validators=[DataRequired()])
|
||||
place_street = StringField(lazy_gettext('Street'), validators=[Optional()])
|
||||
place_postalCode = StringField(lazy_gettext('Postal code'), validators=[DataRequired()])
|
||||
place_city = StringField(lazy_gettext('City'), validators=[DataRequired()])
|
||||
|
||||
host_name = StringField(lazy_gettext('Event host'), validators=[DataRequired()])
|
||||
contact_name = StringField(lazy_gettext('Contact name'), validators=[DataRequired()])
|
||||
contact_email = EmailField(lazy_gettext('Contact email'), validators=[DataRequired()])
|
||||
41
forms/organizer.py
Normal file
41
forms/organizer.py
Normal file
@ -0,0 +1,41 @@
|
||||
from flask_babelex import lazy_gettext
|
||||
from flask_wtf import FlaskForm
|
||||
from flask_wtf.file import FileField, FileAllowed
|
||||
from wtforms import StringField, SubmitField, DecimalField, TextAreaField, FormField, SelectField
|
||||
from wtforms.fields.html5 import EmailField, TelField
|
||||
from wtforms.validators import DataRequired, Optional, Regexp
|
||||
import decimal
|
||||
from models import Location
|
||||
|
||||
class OrganizerLocationForm(FlaskForm):
|
||||
street = StringField(lazy_gettext('Street'), validators=[Optional()])
|
||||
postalCode = StringField(lazy_gettext('Postal code'), validators=[Optional()])
|
||||
city = StringField(lazy_gettext('City'), validators=[Optional()])
|
||||
state = StringField(lazy_gettext('State'), validators=[Optional()])
|
||||
latitude = DecimalField(lazy_gettext('Latitude'), places=16, validators=[Optional()])
|
||||
longitude = DecimalField(lazy_gettext('Longitude'), places=16, validators=[Optional()])
|
||||
|
||||
class BaseOrganizerForm(FlaskForm):
|
||||
name = StringField(lazy_gettext('Name'), validators=[DataRequired()])
|
||||
url = StringField(lazy_gettext('Link URL'), validators=[Optional()])
|
||||
email = EmailField(lazy_gettext('Email'), validators=[Optional()])
|
||||
phone = TelField(lazy_gettext('Phone'), validators=[Optional()])
|
||||
fax = TelField(lazy_gettext('Fax'), validators=[Optional()])
|
||||
logo_file = FileField(lazy_gettext('Logo'), validators=[FileAllowed(['jpg', 'jpeg', 'png'], lazy_gettext('Images only!'))])
|
||||
location = FormField(OrganizerLocationForm)
|
||||
|
||||
def populate_obj(self, obj):
|
||||
for name, field in self._fields.items():
|
||||
if name == 'location' and not obj.location:
|
||||
obj.location = Location()
|
||||
field.populate_obj(obj, name)
|
||||
|
||||
class CreateOrganizerForm(BaseOrganizerForm):
|
||||
submit = SubmitField(lazy_gettext("Create organizer"))
|
||||
|
||||
class UpdateOrganizerForm(BaseOrganizerForm):
|
||||
submit = SubmitField(lazy_gettext("Update organizer"))
|
||||
|
||||
class DeleteOrganizerForm(FlaskForm):
|
||||
submit = SubmitField(lazy_gettext("Delete organizer"))
|
||||
name = StringField(lazy_gettext('Name'), validators=[DataRequired()])
|
||||
45
jsonld.py
45
jsonld.py
@ -42,47 +42,9 @@ def get_sd_for_admin_unit(admin_unit):
|
||||
result["name"] = admin_unit.name
|
||||
return result
|
||||
|
||||
def get_sd_for_organizer_organization_contact(organizer):
|
||||
result = {}
|
||||
result["@type"] = "ContactPoint"
|
||||
result["name"] = organizer.name
|
||||
|
||||
if organizer.email:
|
||||
result["email"] = organizer.email
|
||||
|
||||
if organizer.phone:
|
||||
result["telephone"] = organizer.phone
|
||||
|
||||
if organizer.fax:
|
||||
result["faxNumber"] = organization.fax
|
||||
|
||||
return result
|
||||
|
||||
def get_sd_for_organizer_organization(organizer):
|
||||
result = {}
|
||||
result["@type"] = "Organization"
|
||||
result["name"] = organizer.org_name
|
||||
|
||||
if organizer.name:
|
||||
result["contactPoint"] = get_sd_for_organizer_organization_contact(organizer)
|
||||
else:
|
||||
if organizer.email:
|
||||
result["email"] = organizer.email
|
||||
|
||||
if organizer.phone:
|
||||
result["phone"] = organizer.phone
|
||||
|
||||
if organizer.fax:
|
||||
result["faxNumber"] = organizer.fax
|
||||
|
||||
if organizer.url:
|
||||
result["url"] = organizer.url
|
||||
|
||||
return result
|
||||
|
||||
def get_sd_for_organizer_person(organizer):
|
||||
result = {}
|
||||
result["@type"] = "Person"
|
||||
result["name"] = organizer.name
|
||||
|
||||
if organizer.email:
|
||||
@ -100,10 +62,7 @@ def get_sd_for_organizer_person(organizer):
|
||||
return result
|
||||
|
||||
def get_sd_for_organizer(organizer):
|
||||
if organizer.org_name:
|
||||
return get_sd_for_organizer_organization(organizer)
|
||||
|
||||
return get_sd_for_organizer_person(organizer)
|
||||
return get_sd_for_organizer_organization(organizer)
|
||||
|
||||
def get_sd_for_ooa(ooa):
|
||||
if ooa.organization:
|
||||
@ -173,8 +132,6 @@ def get_sd_for_event_date(event_date):
|
||||
organizer_list = list()
|
||||
if event.organizer:
|
||||
organizer_list.append(get_sd_for_organizer(event.organizer))
|
||||
if event.host:
|
||||
organizer_list.append(get_sd_for_ooa(event.host))
|
||||
result["organizer"] = organizer_list
|
||||
|
||||
if event_date.end:
|
||||
|
||||
42
migrations/versions/699c4f6a7fe8_.py
Normal file
42
migrations/versions/699c4f6a7fe8_.py
Normal file
@ -0,0 +1,42 @@
|
||||
"""empty message
|
||||
|
||||
Revision ID: 699c4f6a7fe8
|
||||
Revises: b1c05324cc13
|
||||
Create Date: 2020-07-28 16:29:41.403957
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
import sqlalchemy_utils
|
||||
import db
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = '699c4f6a7fe8'
|
||||
down_revision = 'b1c05324cc13'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('eventorganizer', sa.Column('admin_unit_id', sa.Integer(), nullable=True))
|
||||
op.create_foreign_key(None, 'eventorganizer', 'adminunit', ['admin_unit_id'], ['id'])
|
||||
op.add_column('eventplace', sa.Column('admin_unit_id', sa.Integer(), nullable=True))
|
||||
op.add_column('eventplace', sa.Column('organizer_id', sa.Integer(), nullable=True))
|
||||
op.add_column('eventplace', sa.Column('public', sa.Boolean(), nullable=True))
|
||||
op.create_foreign_key(None, 'eventplace', 'eventorganizer', ['organizer_id'], ['id'])
|
||||
op.create_foreign_key(None, 'eventplace', 'adminunit', ['admin_unit_id'], ['id'])
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_constraint(None, 'eventplace', type_='foreignkey')
|
||||
op.drop_constraint(None, 'eventplace', type_='foreignkey')
|
||||
op.drop_column('eventplace', 'public')
|
||||
op.drop_column('eventplace', 'organizer_id')
|
||||
op.drop_column('eventplace', 'admin_unit_id')
|
||||
op.drop_constraint(None, 'eventorganizer', type_='foreignkey')
|
||||
op.drop_column('eventorganizer', 'admin_unit_id')
|
||||
# ### end Alembic commands ###
|
||||
36
migrations/versions/dcd0b71650b0_.py
Normal file
36
migrations/versions/dcd0b71650b0_.py
Normal file
@ -0,0 +1,36 @@
|
||||
"""empty message
|
||||
|
||||
Revision ID: dcd0b71650b0
|
||||
Revises: 699c4f6a7fe8
|
||||
Create Date: 2020-07-28 17:10:49.606513
|
||||
|
||||
"""
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
import sqlalchemy_utils
|
||||
import db
|
||||
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = 'dcd0b71650b0'
|
||||
down_revision = '699c4f6a7fe8'
|
||||
branch_labels = None
|
||||
depends_on = None
|
||||
|
||||
|
||||
def upgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.add_column('eventorganizer', sa.Column('location_id', sa.Integer(), nullable=True))
|
||||
op.add_column('eventorganizer', sa.Column('logo_id', sa.Integer(), nullable=True))
|
||||
op.create_foreign_key(None, 'eventorganizer', 'image', ['logo_id'], ['id'])
|
||||
op.create_foreign_key(None, 'eventorganizer', 'location', ['location_id'], ['id'])
|
||||
# ### end Alembic commands ###
|
||||
|
||||
|
||||
def downgrade():
|
||||
# ### commands auto generated by Alembic - please adjust! ###
|
||||
op.drop_constraint(None, 'eventorganizer', type_='foreignkey')
|
||||
op.drop_constraint(None, 'eventorganizer', type_='foreignkey')
|
||||
op.drop_column('eventorganizer', 'logo_id')
|
||||
op.drop_column('eventorganizer', 'location_id')
|
||||
# ### end Alembic commands ###
|
||||
11
models.py
11
models.py
@ -162,6 +162,8 @@ class AdminUnit(db.Model, TrackableMixin):
|
||||
short_name = Column(Unicode(100), unique=True)
|
||||
members = relationship('AdminUnitMember', backref=backref('adminunit', lazy=True))
|
||||
organizations = relationship('AdminUnitOrg', backref=backref('adminunit', lazy=True))
|
||||
event_organizers = relationship('EventOrganizer', backref=backref('adminunit', lazy=True))
|
||||
event_places = relationship('EventPlace', backref=backref('adminunit', lazy=True))
|
||||
location_id = db.Column(db.Integer, db.ForeignKey('location.id'))
|
||||
location = db.relationship('Location')
|
||||
logo_id = db.Column(db.Integer, db.ForeignKey('image.id'))
|
||||
@ -247,6 +249,9 @@ class EventPlace(db.Model, TrackableMixin):
|
||||
photo = db.relationship('Image', uselist=False)
|
||||
url = Column(String(255))
|
||||
description = Column(UnicodeText())
|
||||
public = Column(Boolean())
|
||||
admin_unit_id = db.Column(db.Integer, db.ForeignKey('adminunit.id'), nullable=True)
|
||||
organizer_id = db.Column(db.Integer, db.ForeignKey('eventorganizer.id'), nullable=True)
|
||||
|
||||
def is_empty(self):
|
||||
return (not self.name)
|
||||
@ -315,6 +320,12 @@ class EventOrganizer(db.Model, TrackableMixin):
|
||||
email = Column(Unicode(255))
|
||||
phone = Column(Unicode(255))
|
||||
fax = Column(Unicode(255))
|
||||
location_id = db.Column(db.Integer, db.ForeignKey('location.id'))
|
||||
location = db.relationship('Location')
|
||||
logo_id = db.Column(db.Integer, db.ForeignKey('image.id'))
|
||||
logo = db.relationship('Image', uselist=False)
|
||||
admin_unit_id = db.Column(db.Integer, db.ForeignKey('adminunit.id'), nullable=True)
|
||||
event_places = relationship('EventPlace', backref=backref('organizer', lazy=True))
|
||||
|
||||
def is_empty(self):
|
||||
return (not self.name
|
||||
|
||||
@ -115,8 +115,7 @@ def scrape(debug):
|
||||
event.organizer = EventOrganizer()
|
||||
|
||||
js_organizer = js_event['organizer']
|
||||
event.organizer.name = js_event['name_public']
|
||||
event.organizer.org_name = js_organizer['name']
|
||||
event.organizer.name = js_event['name_public'] if js_event['name_public'] else js_organizer['name']
|
||||
event.organizer.phone = js_event['phone_public'] if js_event['phone_public'] else js_organizer['phone']
|
||||
event.organizer.email = js_event['email_public'] if js_event['email_public'] else js_organizer['email']
|
||||
event.organizer.url = js_organizer['website'] if js_organizer['website'] else js_organizer['facebook']
|
||||
|
||||
@ -48,6 +48,10 @@
|
||||
</p>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro render_event_organizer(organizer) %}
|
||||
{{ organizer.name }}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro render_ooa(ooa) %}
|
||||
{% if ooa.admin_unit %}
|
||||
{{ ooa.admin_unit.name }}
|
||||
@ -110,7 +114,7 @@
|
||||
<i class="fa fa-check-circle text-success" data-toggle="tooltip" title="{{ _('Verified') }}"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ render_ooa(event.host) }}</td>
|
||||
<td>{{ render_event_organizer(event.organizer) }}</td>
|
||||
<td>{{ render_place(event.place) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
@ -296,7 +300,6 @@
|
||||
{{ render_range_prop(event.age_from, event.age_to, 'fa-people-arrows', 'Typical Age range') }}
|
||||
{{ render_enum_prop(event.target_group_origin, 'fa-users', 'Target group origin') }}
|
||||
{{ render_enum_prop(event.attendance_mode, 'fa-mouse-pointer', 'Attendance mode') }}
|
||||
<!--<div><i class="fa fa-fw fa-users" data-toggle="tooltip" title="{{ _('Host') }}"></i> {{ render_ooa_with_link(event.host) }}</div>-->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -357,7 +360,6 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_string_prop(event.organizer.name) }}
|
||||
{{ render_string_prop(event.organizer.org_name) }}
|
||||
{{ render_link_prop(event.organizer.url) }}
|
||||
{{ render_email_prop(event.organizer.email) }}
|
||||
{{ render_phone_prop(event.organizer.phone) }}
|
||||
@ -367,53 +369,6 @@
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% if event.host %}
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
{{ _('Host') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
{% if event.host.admin_unit %}
|
||||
<h5 class="card-title"><a href="{{ url_for('admin_unit', admin_unit_id=event.host.admin_unit.id) }}" class="text-dark">{{ event.host.admin_unit.name }}</a></h5>
|
||||
|
||||
{% if event.host.admin_unit.logo_id %}
|
||||
<div class="my-4">{{ render_logo(event.host.admin_unit.logo_id) }}</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="my-4">
|
||||
{{ render_link_prop(event.host.admin_unit.url) }}
|
||||
{{ render_email_prop(event.host.admin_unit.email) }}
|
||||
{{ render_phone_prop(event.host.admin_unit.phone) }}
|
||||
{{ render_fax_prop(event.host.admin_unit.fax) }}
|
||||
{{ render_location_prop(event.host.admin_unit.location) }}
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
|
||||
{% if event.host.organization %}
|
||||
<h5 class="card-title"><a href="{{ url_for('organization', organization_id=event.host.organization.id) }}" class="text-dark">{{ event.host.organization.name }}</a></h5>
|
||||
|
||||
{% if event.host.organization.logo_id %}
|
||||
<div class="my-4">{{ render_logo(event.host.organization.logo_id) }}</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="my-4">
|
||||
{{ render_link_prop(event.host.organization.url) }}
|
||||
{{ render_email_prop(event.host.organization.email) }}
|
||||
{{ render_phone_prop(event.host.organization.phone) }}
|
||||
{{ render_fax_prop(event.host.organization.fax) }}
|
||||
{{ render_location_prop(event.host.organization.location) }}
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endif %}
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-header">
|
||||
{{ _('Admin unit') }}
|
||||
@ -510,4 +465,16 @@
|
||||
{% if event.recurrence_rule %}
|
||||
<i class="fas fa-history"></i>
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro render_tab(id, title, link, active_id=None) %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link{% if active_id == id %} active{% endif %}" href="{{ link }}">{{ title }}</a>
|
||||
</li>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro render_manage_menu(admin_unit, active_id=None) %}
|
||||
<ul class="nav nav-tabs">
|
||||
{{ render_tab('organizers', _('Organizers'), url_for('manage_admin_unit_organizers', id=admin_unit.id), active_id) }}
|
||||
</ul>
|
||||
{% endmacro %}
|
||||
@ -8,17 +8,6 @@
|
||||
<form action="" method="POST" enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
{% if not form.admin_unit_is_readonly %}
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Admin unit') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.admin_unit_id, class="autocomplete w-100") }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Event') }}
|
||||
@ -42,22 +31,10 @@
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Host') }} *
|
||||
{{ _('Organizer') }} *
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if form.host_id.choices|length > 1 %}
|
||||
{{ render_field_with_errors(form.host_id, class="autocomplete w-100") }}
|
||||
{% endif %}
|
||||
|
||||
<div class="my-4">
|
||||
{{ form.organizer.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.organizer.form.name) }}
|
||||
{{ render_field_with_errors(form.organizer.form.org_name) }}
|
||||
{{ render_field_with_errors(form.organizer.form.url) }}
|
||||
{{ render_field_with_errors(form.organizer.form.email) }}
|
||||
{{ render_field_with_errors(form.organizer.form.phone) }}
|
||||
{{ render_field_with_errors(form.organizer.form.fax) }}
|
||||
</div>
|
||||
{{ render_field_with_errors(form.organizer_id, class="autocomplete w-100") }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_event_status_pill, render_event_date, render_ooa, render_place, render_events_sub_menu %}
|
||||
{% from "_macros.html" import render_event_organizer, render_event_status_pill, render_event_date, render_ooa, render_place, render_events_sub_menu %}
|
||||
{% block title %}
|
||||
{{ _('Events') }}
|
||||
{% endblock %}
|
||||
@ -30,7 +30,7 @@
|
||||
<i class="fa fa-check-circle text-success" data-toggle="tooltip" title="{{ _('Verified') }}"></i>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ render_ooa(event.host) }}</td>
|
||||
<td>{{ render_event_organizer(event.organizer) }}</td>
|
||||
<td>{{ render_place(event.place) }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
||||
@ -41,20 +41,15 @@
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Host') }}
|
||||
{{ _('Organizer') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.host_id, class="autocomplete w-100") }}
|
||||
|
||||
<div class="my-4">
|
||||
{{ form.organizer.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.organizer.form.name) }}
|
||||
{{ render_field_with_errors(form.organizer.form.org_name) }}
|
||||
{{ render_field_with_errors(form.organizer.form.url) }}
|
||||
{{ render_field_with_errors(form.organizer.form.email) }}
|
||||
{{ render_field_with_errors(form.organizer.form.phone) }}
|
||||
{{ render_field_with_errors(form.organizer.form.fax) }}
|
||||
</div>
|
||||
{{ form.organizer.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.organizer.form.name) }}
|
||||
{{ render_field_with_errors(form.organizer.form.url) }}
|
||||
{{ render_field_with_errors(form.organizer.form.email) }}
|
||||
{{ render_field_with_errors(form.organizer.form.phone) }}
|
||||
{{ render_field_with_errors(form.organizer.form.fax) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@ -1,33 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_datepicker_js, render_field_with_errors, render_field %}
|
||||
|
||||
{% block header %}
|
||||
<script>
|
||||
$( function() {
|
||||
{{ render_datepicker_js('start') }}
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ _('Suggest event') }}</h1>
|
||||
<form action="{{ url_for('event_suggestion_create') }}" method="POST">
|
||||
{{ form.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.event_name) }}
|
||||
{{ render_field_with_errors(form.description) }}
|
||||
{{ render_field_with_errors(form.external_link) }}
|
||||
{{ render_field_with_errors(form.start) }}
|
||||
|
||||
{{ render_field_with_errors(form.place_name) }}
|
||||
{{ render_field_with_errors(form.place_street) }}
|
||||
{{ render_field_with_errors(form.place_postalCode) }}
|
||||
{{ render_field_with_errors(form.place_city) }}
|
||||
|
||||
{{ render_field_with_errors(form.host_name) }}
|
||||
{{ render_field_with_errors(form.contact_name) }}
|
||||
{{ render_field_with_errors(form.contact_email) }}
|
||||
|
||||
{{ render_field(form.submit) }}
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
@ -1,36 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}
|
||||
{{ _('Event suggestions') }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ _('Event suggestions') }}</h1>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm table-bordered table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{{ _('Date') }}</th>
|
||||
<th>{{ _('Name') }}</th>
|
||||
<th>{{ _('Host') }}</th>
|
||||
<th>{{ _('Location') }}</th>
|
||||
<th>{{ _('Created at') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for suggestion in suggestions %}
|
||||
<tr>
|
||||
<td>{{ suggestion.dates[0].start | datetimeformat }}</td>
|
||||
<td>
|
||||
<a href="{{ url_for('eventsuggestion', event_suggestion_id=suggestion.id) }}">{{ suggestion.event_name }}</a>
|
||||
</td>
|
||||
<td>{{ suggestion.host_name }}</td>
|
||||
<td>{{ suggestion.place_name }}</td>
|
||||
<td>{{ suggestion.created_at | datetimeformat }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -1,93 +0,0 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}
|
||||
{{ suggestion.event_name }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ suggestion.event_name }}</h1>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm table-bordered table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2">{{ _('Event') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ _('Date') }}</td>
|
||||
<td>{{ suggestion.dates[0].start | datetimeformat }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Event name') }}</td>
|
||||
<td>{{ suggestion.event_name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Description') }}</td>
|
||||
<td>{{ suggestion.description }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Link URL') }}</td>
|
||||
<td>{% if suggestion.external_link %}<a href="{{ suggestion.external_link }}">{{ suggestion.external_link }}</a>{% endif %}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm table-bordered table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2">{{ _('Location') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ _('Event place') }}</td>
|
||||
<td>{{ suggestion.place_name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Street') }}</td>
|
||||
<td>{{ suggestion.place_street }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Postal code') }}</td>
|
||||
<td>{{ suggestion.place_postalCode }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('City') }}</td>
|
||||
<td>{{ suggestion.place_city }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-sm table-bordered table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="2">{{ _('Contact') }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ _('Event host') }}</td>
|
||||
<td>{{ suggestion.host_name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Contact name') }}</td>
|
||||
<td>{{ suggestion.contact_name }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Contact email') }}</td>
|
||||
<td>{% if suggestion.contact_email %}<a href="mailto:{{ suggestion.contact_email }}">{{ suggestion.contact_email }}</a>{% endif %}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{{ _('Created at') }}</td>
|
||||
<td>{{ suggestion.created_at | datetimeformat }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -47,11 +47,10 @@
|
||||
</button>
|
||||
<div class="collapse navbar-collapse" id="navbarNavAltMarkup">
|
||||
<div class="navbar-nav mr-auto">
|
||||
<a class="nav-item nav-link" href="{{ url_for('event_dates') }}">{{ _('Event Dates') }}</a>
|
||||
<a class="nav-item nav-link" href="{{ url_for('events') }}">{{ _('Events') }}</a>
|
||||
<a class="nav-item nav-link" href="{{ url_for('places') }}">{{ _('Places') }}</a>
|
||||
<a class="nav-item nav-link" href="{{ url_for('admin_units') }}">{{ _('Admin Units') }}</a>
|
||||
<a class="nav-item nav-link" href="{{ url_for('organizations') }}">{{ _('Organizations') }}</a>
|
||||
{% if current_user.is_authenticated %}
|
||||
<a class="nav-item nav-link" href="{{ url_for('manage') }}">{{ _('Manage') }}</a>
|
||||
{% endif %}
|
||||
|
||||
<a class="nav-item nav-link" href="{{ url_for('developer') }}">{{ _('Developer') }}</a>
|
||||
</div>
|
||||
<div class="navbar-nav navbar-right">
|
||||
|
||||
12
templates/manage/admin_unit.html
Normal file
12
templates/manage/admin_unit.html
Normal file
@ -0,0 +1,12 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_manage_menu %}
|
||||
{% block title %}
|
||||
{{ admin_unit.name }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ admin_unit.name }}</h1>
|
||||
|
||||
{{ render_manage_menu(admin_unit) }}
|
||||
|
||||
{% endblock %}
|
||||
13
templates/manage/admin_units.html
Normal file
13
templates/manage/admin_units.html
Normal file
@ -0,0 +1,13 @@
|
||||
{% extends "layout.html" %}
|
||||
{% block title %}
|
||||
{{ _('Admin Units') }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<div class="list-group list-group-flush">
|
||||
{% for admin_unit in admin_units %}
|
||||
<a href="{{ url_for('manage_admin_unit', id=admin_unit.id) }}" class="list-group-item list-group-item-action">{{ admin_unit.name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
32
templates/manage/organizers.html
Normal file
32
templates/manage/organizers.html
Normal file
@ -0,0 +1,32 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_event_organizer, render_manage_menu %}
|
||||
{% block title %}
|
||||
{{ _('Organizers') }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ admin_unit.name }}</h1>
|
||||
|
||||
{{ render_manage_menu(admin_unit, 'organizers') }}
|
||||
|
||||
<div class="my-4">
|
||||
<a class="btn btn-outline-secondary my-1" href="{{ url_for('manage_admin_unit_organizer_create', id=admin_unit.id) }}" role="button"><i class="fa fa-plus"></i> {{ _('Create organizer') }}</a>
|
||||
</div>
|
||||
|
||||
<ul class="list-group">
|
||||
{% for organizer in organizers %}
|
||||
<li class="list-group-item">
|
||||
<div class="dropdown d-inline-block">
|
||||
<button class="btn btn-link dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">{{ render_event_organizer(organizer) }}</button>
|
||||
<div class="dropdown-menu">
|
||||
<a class="dropdown-item" href="{{ url_for('event_create_for_admin_unit_id', id=admin_unit.id, organizer_id=organizer.id) }}">{{ _('Create event') }}</a>
|
||||
<a class="dropdown-item" href="{{ url_for('organizer_update', id=organizer.id) }}">{{ _('Edit') }}</a>
|
||||
<a class="dropdown-item" href="{{ url_for('organizer_delete', id=organizer.id) }}">{{ _('Delete') }}...</a>
|
||||
<!--<a class="dropdown-item" href="#">{{ _('Assistents') }}</a>-->
|
||||
</div>
|
||||
</div>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
{% endblock %}
|
||||
57
templates/organizer/create.html
Normal file
57
templates/organizer/create.html
Normal file
@ -0,0 +1,57 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_google_place_autocomplete_header, render_google_place_autocomplete_field, render_field_with_errors, render_field %}
|
||||
|
||||
{% block header %}
|
||||
{{ render_google_place_autocomplete_header(True) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ _('Create organizer') }}</h1>
|
||||
<form action="" method="POST" enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Organizer') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.name) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Location') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
{{ render_google_place_autocomplete_field() }}
|
||||
|
||||
{{ form.location.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.location.street) }}
|
||||
{{ render_field_with_errors(form.location.postalCode) }}
|
||||
{{ render_field_with_errors(form.location.city) }}
|
||||
{{ render_field_with_errors(form.location.state) }}
|
||||
{{ render_field_with_errors(form.location.latitude) }}
|
||||
{{ render_field_with_errors(form.location.longitude) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Additional information') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.url) }}
|
||||
{{ render_field_with_errors(form.email) }}
|
||||
{{ render_field_with_errors(form.phone) }}
|
||||
{{ render_field_with_errors(form.fax) }}
|
||||
{{ render_field_with_errors(form.logo_file) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ render_field(form.submit) }}
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
24
templates/organizer/delete.html
Normal file
24
templates/organizer/delete.html
Normal file
@ -0,0 +1,24 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_field_with_errors, render_field %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ _('Delete organizer') }} "{{ organizer.name }}"</h1>
|
||||
|
||||
<form action="" method="POST">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Organizer') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.name) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ render_field(form.submit) }}
|
||||
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
29
templates/organizer/read.html
Normal file
29
templates/organizer/read.html
Normal file
@ -0,0 +1,29 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_string_prop, render_logo, render_phone_prop, render_fax_prop, render_email_prop, render_events, render_location_prop, render_link_prop, render_image %}
|
||||
{% block title %}
|
||||
{{ organizer.name }}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ organizer.name }}</h1>
|
||||
|
||||
{% if can_update_organizer %}
|
||||
<div class="my-4">
|
||||
<a class="btn btn-primary my-1" href="{{ url_for('organizer_update', id=organizer.id) }}" role="button"><i class="fa fa-edit"></i> {{ _('Update organizer') }}</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
<div class="my-4">
|
||||
{{ render_location_prop(organizer.location) }}
|
||||
{{ render_link_prop(organizer.url) }}
|
||||
{{ render_email_prop(organizer.email) }}
|
||||
{{ render_phone_prop(organizer.phone) }}
|
||||
{{ render_fax_prop(organizer.fax) }}
|
||||
</div>
|
||||
|
||||
{% if organizer.logo_id %}
|
||||
<div class="my-4">{{ render_logo(organizer.logo_id) }}</div>
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
||||
57
templates/organizer/update.html
Normal file
57
templates/organizer/update.html
Normal file
@ -0,0 +1,57 @@
|
||||
{% extends "layout.html" %}
|
||||
{% from "_macros.html" import render_google_place_autocomplete_header, render_google_place_autocomplete_field, render_field_with_errors, render_field %}
|
||||
|
||||
{% block header %}
|
||||
{{ render_google_place_autocomplete_header(True) }}
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h1>{{ _('Update organizer') }}</h1>
|
||||
<form action="{{ url_for('organizer_update', id=organizer.id) }}" method="POST" enctype="multipart/form-data">
|
||||
{{ form.hidden_tag() }}
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Organizer') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.name) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Location') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
|
||||
{{ render_google_place_autocomplete_field() }}
|
||||
|
||||
{{ form.location.hidden_tag() }}
|
||||
{{ render_field_with_errors(form.location.street) }}
|
||||
{{ render_field_with_errors(form.location.postalCode) }}
|
||||
{{ render_field_with_errors(form.location.city) }}
|
||||
{{ render_field_with_errors(form.location.state) }}
|
||||
{{ render_field_with_errors(form.location.latitude) }}
|
||||
{{ render_field_with_errors(form.location.longitude) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header">
|
||||
{{ _('Additional information') }}
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{{ render_field_with_errors(form.url) }}
|
||||
{{ render_field_with_errors(form.email) }}
|
||||
{{ render_field_with_errors(form.phone) }}
|
||||
{{ render_field_with_errors(form.fax) }}
|
||||
{{ render_field_with_errors(form.logo_file) }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{ render_field(form.submit) }}
|
||||
</form>
|
||||
|
||||
{% endblock %}
|
||||
Binary file not shown.
@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2020-07-26 16:04+0200\n"
|
||||
"POT-Creation-Date: 2020-07-30 11:20+0200\n"
|
||||
"PO-Revision-Date: 2020-06-07 18:51+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language: de\n"
|
||||
@ -102,87 +102,103 @@ msgstr "Sonstiges"
|
||||
msgid "Typical Age range"
|
||||
msgstr "Typische Altersspanne"
|
||||
|
||||
#: app.py:1029
|
||||
#: app.py:750
|
||||
#, python-format
|
||||
msgid "Error in the %s field - %s"
|
||||
msgstr "Fehler im Feld %s: %s"
|
||||
|
||||
#: app.py:1081
|
||||
#: app.py:802
|
||||
msgid "Admin unit successfully updated"
|
||||
msgstr "Verwaltungseinheit erfolgreich aktualisiert"
|
||||
|
||||
#: app.py:1138
|
||||
#: app.py:860
|
||||
msgid "Organization successfully created"
|
||||
msgstr "Organisation erfolgreich erstellt"
|
||||
|
||||
#: app.py:1158
|
||||
#: app.py:881
|
||||
msgid "Organization successfully updated"
|
||||
msgstr "Organisation erfolgreich aktualisiert"
|
||||
|
||||
#: app.py:1217
|
||||
#: app.py:941
|
||||
msgid "Place successfully updated"
|
||||
msgstr "Ort erfolgreich aktualisiert"
|
||||
|
||||
#: app.py:1240
|
||||
#: app.py:965
|
||||
msgid "Place successfully created"
|
||||
msgstr "Ort erfolgreich erstellt"
|
||||
|
||||
#: app.py:1344
|
||||
#: app.py:1069
|
||||
msgid "Event successfully created"
|
||||
msgstr "Veranstaltung erfolgreich erstellt"
|
||||
|
||||
#: app.py:1367
|
||||
#: app.py:1104
|
||||
msgid "Event successfully updated"
|
||||
msgstr "Veranstaltung erfolgreich aktualisiert"
|
||||
|
||||
#: app.py:1389
|
||||
#: app.py:1127
|
||||
msgid "Entered name does not match event name"
|
||||
msgstr "Der eingegebene Name entspricht nicht dem Namen der Veranstaltung"
|
||||
|
||||
#: app.py:1394
|
||||
#: app.py:1132
|
||||
msgid "Event successfully deleted"
|
||||
msgstr "Veranstaltung erfolgreich gelöscht"
|
||||
|
||||
#: app.py:1228
|
||||
msgid "Organizer successfully created"
|
||||
msgstr "Veranstalter erfolgreich erstellt"
|
||||
|
||||
#: app.py:1250
|
||||
msgid "Organizer successfully updated"
|
||||
msgstr "Veranstalter erfolgreich aktualisiert"
|
||||
|
||||
#: app.py:1272
|
||||
msgid "Entered name does not match organizer name"
|
||||
msgstr "Der eingegebene Name entspricht nicht dem Namen des Veranstalters"
|
||||
|
||||
#: app.py:1277
|
||||
msgid "Organizer successfully deleted"
|
||||
msgstr "Veranstalter erfolgreich gelöscht"
|
||||
|
||||
#: oauth.py:41 oauth.py:54
|
||||
msgid "Successfully signed in."
|
||||
msgstr "Erfolgreich eingeloggt."
|
||||
|
||||
#: forms/admin_unit.py:11 forms/event.py:12 forms/event_suggestion.py:16
|
||||
#: forms/organization.py:11 forms/place.py:9
|
||||
#: templates/event_suggestion/read.html:50
|
||||
#: forms/admin_unit.py:11 forms/event.py:12 forms/organization.py:11
|
||||
#: forms/organizer.py:11 forms/place.py:9
|
||||
msgid "Street"
|
||||
msgstr "Straße"
|
||||
|
||||
#: forms/admin_unit.py:12 forms/event.py:13 forms/event_suggestion.py:17
|
||||
#: forms/organization.py:12 forms/place.py:10
|
||||
#: templates/event_suggestion/read.html:54
|
||||
#: forms/admin_unit.py:12 forms/event.py:13 forms/organization.py:12
|
||||
#: forms/organizer.py:12 forms/place.py:10
|
||||
msgid "Postal code"
|
||||
msgstr "Postleitzahl"
|
||||
|
||||
#: forms/admin_unit.py:13 forms/event.py:14 forms/event_suggestion.py:18
|
||||
#: forms/organization.py:13 forms/place.py:11
|
||||
#: templates/event_suggestion/read.html:58
|
||||
#: forms/admin_unit.py:13 forms/event.py:14 forms/organization.py:13
|
||||
#: forms/organizer.py:13 forms/place.py:11
|
||||
msgid "City"
|
||||
msgstr "Stadt/Ort"
|
||||
|
||||
#: forms/admin_unit.py:14 forms/organization.py:14 forms/place.py:12
|
||||
#: forms/admin_unit.py:14 forms/organization.py:14 forms/organizer.py:14
|
||||
#: forms/place.py:12
|
||||
msgid "State"
|
||||
msgstr "Bundesland"
|
||||
|
||||
#: forms/admin_unit.py:15 forms/organization.py:15 forms/place.py:13
|
||||
#: forms/admin_unit.py:15 forms/organization.py:15 forms/organizer.py:15
|
||||
#: forms/place.py:13
|
||||
msgid "Latitude"
|
||||
msgstr "Breitengrad"
|
||||
|
||||
#: forms/admin_unit.py:16 forms/organization.py:16 forms/place.py:14
|
||||
#: forms/admin_unit.py:16 forms/organization.py:16 forms/organizer.py:16
|
||||
#: forms/place.py:14
|
||||
msgid "Longitude"
|
||||
msgstr "Längengrad"
|
||||
|
||||
#: forms/admin_unit.py:19 forms/event.py:36 forms/event.py:107
|
||||
#: forms/event_suggestion.py:10 forms/organization.py:19 forms/place.py:19
|
||||
#: templates/_macros.html:97 templates/admin/admin_units.html:18
|
||||
#: templates/admin_unit/list.html:13 templates/admin_unit/read.html:66
|
||||
#: templates/admin_unit/read.html:88 templates/event/list.html:17
|
||||
#: templates/event_suggestion/list.html:14 templates/organization/list.html:19
|
||||
#: forms/admin_unit.py:19 forms/event.py:35 forms/event.py:97
|
||||
#: forms/organization.py:19 forms/organizer.py:19 forms/organizer.py:41
|
||||
#: forms/place.py:19 templates/_macros.html:101
|
||||
#: templates/admin/admin_units.html:18 templates/admin_unit/list.html:13
|
||||
#: templates/admin_unit/read.html:66 templates/admin_unit/read.html:88
|
||||
#: templates/event/list.html:17 templates/organization/list.html:19
|
||||
#: templates/organization/read.html:64 templates/place/list.html:19
|
||||
#: templates/profile.html:15 templates/profile.html:37
|
||||
msgid "Name"
|
||||
@ -196,33 +212,32 @@ msgstr "Kurzname"
|
||||
msgid "Short name must contain only letters numbers or underscore"
|
||||
msgstr "Der Kurzname darf nur Buchstaben, Nummern und Unterstriche enthalten"
|
||||
|
||||
#: forms/admin_unit.py:21 forms/event.py:29 forms/event.py:37
|
||||
#: forms/event_suggestion.py:13 forms/organization.py:20 forms/place.py:20
|
||||
#: templates/event_suggestion/read.html:30
|
||||
#: forms/admin_unit.py:21 forms/event.py:28 forms/event.py:36
|
||||
#: forms/organization.py:20 forms/organizer.py:20 forms/place.py:20
|
||||
msgid "Link URL"
|
||||
msgstr "Link URL"
|
||||
|
||||
#: forms/admin_unit.py:22 forms/event.py:30 forms/organization.py:21
|
||||
#: templates/_macros.html:203
|
||||
#: forms/admin_unit.py:22 forms/event.py:29 forms/organization.py:21
|
||||
#: forms/organizer.py:21 templates/_macros.html:207
|
||||
msgid "Email"
|
||||
msgstr "Email"
|
||||
|
||||
#: forms/admin_unit.py:23 forms/event.py:31 forms/organization.py:22
|
||||
#: templates/_macros.html:218
|
||||
#: forms/admin_unit.py:23 forms/event.py:30 forms/organization.py:22
|
||||
#: forms/organizer.py:22 templates/_macros.html:222
|
||||
msgid "Phone"
|
||||
msgstr "Telefon"
|
||||
|
||||
#: forms/admin_unit.py:24 forms/event.py:32 forms/organization.py:23
|
||||
#: templates/_macros.html:226
|
||||
#: forms/admin_unit.py:24 forms/event.py:31 forms/organization.py:23
|
||||
#: forms/organizer.py:23 templates/_macros.html:230
|
||||
msgid "Fax"
|
||||
msgstr "Fax"
|
||||
|
||||
#: forms/admin_unit.py:25 forms/organization.py:24
|
||||
#: forms/admin_unit.py:25 forms/organization.py:24 forms/organizer.py:24
|
||||
msgid "Logo"
|
||||
msgstr "Logo"
|
||||
|
||||
#: forms/admin_unit.py:25 forms/event.py:76 forms/organization.py:24
|
||||
#: forms/place.py:21
|
||||
#: forms/admin_unit.py:25 forms/event.py:67 forms/organization.py:24
|
||||
#: forms/organizer.py:24 forms/place.py:21
|
||||
msgid "Images only!"
|
||||
msgstr "Nur Fotos!"
|
||||
|
||||
@ -243,180 +258,147 @@ msgstr "Neuer Ort"
|
||||
msgid "Organizator"
|
||||
msgstr "Organisator"
|
||||
|
||||
#: forms/event.py:28 templates/organization/create.html:16
|
||||
#: templates/organization/update.html:16
|
||||
msgid "Organization"
|
||||
msgstr "Organisation"
|
||||
|
||||
#: forms/event.py:35 templates/_macros.html:87 templates/event/create.html:6
|
||||
#: forms/event.py:34 templates/_macros.html:91 templates/event/create.html:6
|
||||
#: templates/home.html:11 templates/manage/organizers.html:22
|
||||
msgid "Create event"
|
||||
msgstr "Veranstaltung erstellen"
|
||||
|
||||
#: forms/event.py:38
|
||||
#: forms/event.py:37
|
||||
msgid "Ticket Link URL"
|
||||
msgstr "Ticket Link"
|
||||
|
||||
#: forms/event.py:39 forms/event_suggestion.py:11 forms/place.py:22
|
||||
#: templates/event_suggestion/read.html:26
|
||||
#: forms/event.py:38 forms/place.py:22
|
||||
msgid "Description"
|
||||
msgstr "Beschreibung"
|
||||
|
||||
#: forms/event.py:40
|
||||
#: forms/event.py:39
|
||||
msgid "Recurrence rule"
|
||||
msgstr "Wiederholungsregel"
|
||||
|
||||
#: forms/event.py:41 forms/event_suggestion.py:12
|
||||
#: forms/event.py:40
|
||||
msgid "Start"
|
||||
msgstr "Beginn"
|
||||
|
||||
#: forms/event.py:42
|
||||
#: forms/event.py:41
|
||||
msgid "End"
|
||||
msgstr "Ende"
|
||||
|
||||
#: forms/event.py:43 templates/_macros.html:275
|
||||
#: forms/event.py:42 templates/_macros.html:279
|
||||
msgid "Previous start date"
|
||||
msgstr "Vorheriges Startdatum"
|
||||
|
||||
#: forms/event.py:44 templates/_macros.html:185
|
||||
#: forms/event.py:43 templates/_macros.html:189
|
||||
msgid "Tags"
|
||||
msgstr "Stichworte"
|
||||
|
||||
#: forms/event.py:49
|
||||
#: forms/event.py:47 templates/_macros.html:359 templates/event/create.html:34
|
||||
#: templates/event/update.html:44 templates/organizer/create.html:16
|
||||
#: templates/organizer/delete.html:13 templates/organizer/update.html:16
|
||||
msgid "Organizer"
|
||||
msgstr "Veranstalter"
|
||||
|
||||
#: forms/event.py:48
|
||||
msgid "Existing place"
|
||||
msgstr "Existierender Ort"
|
||||
|
||||
#: forms/event.py:50 templates/_macros.html:98 templates/_macros.html:299
|
||||
#: templates/_macros.html:374 templates/event/create.html:44
|
||||
#: templates/event/list.html:18 templates/event/update.html:44
|
||||
#: templates/event_suggestion/list.html:15
|
||||
msgid "Host"
|
||||
msgstr "Veranstalter"
|
||||
|
||||
#: forms/event.py:51 templates/_macros.html:291
|
||||
#: forms/event.py:49 templates/_macros.html:295
|
||||
msgid "Category"
|
||||
msgstr "Kategorie"
|
||||
|
||||
#: forms/event.py:52 forms/organization.py:37
|
||||
#: templates/admin_unit/update.html:16 templates/event/create.html:112
|
||||
#: templates/event/update.html:109 templates/organization/create.html:58
|
||||
#: forms/event.py:50 forms/organization.py:37 templates/_macros.html:374
|
||||
#: templates/admin_unit/update.html:16 templates/event/update.html:104
|
||||
#: templates/organization/create.html:58
|
||||
msgid "Admin unit"
|
||||
msgstr "Verwaltungseinheit"
|
||||
|
||||
#: forms/event.py:54
|
||||
#: forms/event.py:52
|
||||
msgid "Kid friendly"
|
||||
msgstr "Für Kinder geeignet"
|
||||
|
||||
#: forms/event.py:55
|
||||
#: forms/event.py:53
|
||||
msgid "Accessible for free"
|
||||
msgstr "Kostenlos zugänglich"
|
||||
|
||||
#: forms/event.py:56
|
||||
#: forms/event.py:54
|
||||
msgid "Typical Age from"
|
||||
msgstr "Typisches Alter von"
|
||||
|
||||
#: forms/event.py:57
|
||||
#: forms/event.py:55
|
||||
msgid "Typical Age to"
|
||||
msgstr "Typisches Alter bis"
|
||||
|
||||
#: forms/event.py:59
|
||||
#: forms/event.py:57
|
||||
msgid "Target group origin"
|
||||
msgstr "Für Touristen/Einwohner geeignet"
|
||||
|
||||
#: forms/event.py:60
|
||||
#: forms/event.py:58
|
||||
msgid "EventTargetGroupOrigin.both"
|
||||
msgstr "Für Touristen und Einwohner"
|
||||
|
||||
#: forms/event.py:61
|
||||
#: forms/event.py:59
|
||||
msgid "EventTargetGroupOrigin.tourist"
|
||||
msgstr "Hauptsächlich für Touristen"
|
||||
|
||||
#: forms/event.py:62
|
||||
#: forms/event.py:60
|
||||
msgid "EventTargetGroupOrigin.resident"
|
||||
msgstr "Hauptsächlich für Einwohner"
|
||||
|
||||
#: forms/event.py:64
|
||||
#: forms/event.py:62
|
||||
msgid "Attendance mode"
|
||||
msgstr "Teilnahme"
|
||||
|
||||
#: forms/event.py:65
|
||||
#: forms/event.py:63
|
||||
msgid "EventAttendanceMode.offline"
|
||||
msgstr "Offline"
|
||||
|
||||
#: forms/event.py:66
|
||||
#: forms/event.py:64
|
||||
msgid "EventAttendanceMode.online"
|
||||
msgstr "Online"
|
||||
|
||||
#: forms/event.py:67
|
||||
#: forms/event.py:65
|
||||
msgid "EventAttendanceMode.mixed"
|
||||
msgstr "Online und offline"
|
||||
|
||||
#: forms/event.py:69 templates/event/create.html:34
|
||||
#: templates/event/update.html:34
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: forms/event.py:70
|
||||
msgid "EventStatus.scheduled"
|
||||
msgstr "Geplant"
|
||||
|
||||
#: forms/event.py:71
|
||||
msgid "EventStatus.cancelled"
|
||||
msgstr "Abgesagt"
|
||||
|
||||
#: forms/event.py:72
|
||||
msgid "EventStatus.movedOnline"
|
||||
msgstr "Online verschoben"
|
||||
|
||||
#: forms/event.py:73
|
||||
msgid "EventStatus.postponed"
|
||||
msgstr "Verschoben"
|
||||
|
||||
#: forms/event.py:74
|
||||
msgid "EventStatus.rescheduled"
|
||||
msgstr "Neu angesetzt"
|
||||
|
||||
#: forms/event.py:76 forms/place.py:21
|
||||
#: forms/event.py:67 forms/place.py:21
|
||||
msgid "Photo"
|
||||
msgstr "Foto"
|
||||
|
||||
#: forms/event.py:90
|
||||
msgid "Select existing host or enter organizer"
|
||||
msgstr "Existierenden Veranstalter wählen oder Organisator eingeben"
|
||||
|
||||
#: forms/event.py:96
|
||||
#: forms/event.py:79
|
||||
msgid "Select existing place or enter new place"
|
||||
msgstr "Existierenden Ort wählen oder neuen Ort eingeben"
|
||||
|
||||
#: forms/event.py:103 templates/event/read.html:31
|
||||
#: templates/event/update.html:6
|
||||
#: forms/event.py:86 templates/event/update.html:34
|
||||
msgid "Status"
|
||||
msgstr "Status"
|
||||
|
||||
#: forms/event.py:87
|
||||
msgid "EventStatus.scheduled"
|
||||
msgstr "Geplant"
|
||||
|
||||
#: forms/event.py:88
|
||||
msgid "EventStatus.cancelled"
|
||||
msgstr "Abgesagt"
|
||||
|
||||
#: forms/event.py:89
|
||||
msgid "EventStatus.movedOnline"
|
||||
msgstr "Online verschoben"
|
||||
|
||||
#: forms/event.py:90
|
||||
msgid "EventStatus.postponed"
|
||||
msgstr "Verschoben"
|
||||
|
||||
#: forms/event.py:91
|
||||
msgid "EventStatus.rescheduled"
|
||||
msgstr "Neu angesetzt"
|
||||
|
||||
#: forms/event.py:93 templates/event/read.html:31 templates/event/update.html:6
|
||||
msgid "Update event"
|
||||
msgstr "Veranstaltung aktualisieren"
|
||||
|
||||
#: forms/event.py:106 templates/event/delete.html:6
|
||||
#: templates/event/read.html:32
|
||||
#: forms/event.py:96 templates/event/delete.html:6 templates/event/read.html:32
|
||||
msgid "Delete event"
|
||||
msgstr "Veranstaltung löschen"
|
||||
|
||||
#: forms/event_suggestion.py:9 templates/event_suggestion/create.html:13
|
||||
msgid "Suggest event"
|
||||
msgstr "Veranstaltung vorschlagen"
|
||||
|
||||
#: forms/event_suggestion.py:15 templates/event_suggestion/read.html:46
|
||||
msgid "Event place"
|
||||
msgstr "Veranstaltungsort"
|
||||
|
||||
#: forms/event_suggestion.py:20 templates/event_suggestion/read.html:74
|
||||
msgid "Event host"
|
||||
msgstr "Veranstalter"
|
||||
|
||||
#: forms/event_suggestion.py:21 templates/event_suggestion/read.html:78
|
||||
msgid "Contact name"
|
||||
msgstr "Kontakt Name"
|
||||
|
||||
#: forms/event_suggestion.py:22 templates/event_suggestion/read.html:82
|
||||
msgid "Contact email"
|
||||
msgstr "Kontakt Email"
|
||||
|
||||
#: forms/organization.py:26
|
||||
msgid "Legal name"
|
||||
msgstr "Offizieller Name"
|
||||
@ -431,6 +413,20 @@ msgstr "Organisation hinzufügen"
|
||||
msgid "Update organization"
|
||||
msgstr "Organisation aktualisieren"
|
||||
|
||||
#: forms/organizer.py:34 templates/manage/organizers.html:13
|
||||
#: templates/organizer/create.html:10
|
||||
msgid "Create organizer"
|
||||
msgstr "Veranstalter hinzufügen"
|
||||
|
||||
#: forms/organizer.py:37 templates/organizer/read.html:12
|
||||
#: templates/organizer/update.html:10
|
||||
msgid "Update organizer"
|
||||
msgstr "Veranstalter aktualisieren"
|
||||
|
||||
#: forms/organizer.py:40 templates/organizer/delete.html:6
|
||||
msgid "Delete organizer"
|
||||
msgstr "Veranstalter löschen"
|
||||
|
||||
#: forms/place.py:17 templates/place/create.html:10
|
||||
#: templates/place/list.html:11
|
||||
msgid "Create place"
|
||||
@ -441,130 +437,116 @@ msgstr "Ort hinzufügen"
|
||||
msgid "Update place"
|
||||
msgstr "Ort aktualisieren"
|
||||
|
||||
#: templates/_macros.html:96 templates/_macros.html:261
|
||||
#: templates/_macros.html:268 templates/event/list.html:16
|
||||
#: templates/event_suggestion/list.html:13
|
||||
#: templates/event_suggestion/read.html:18
|
||||
#: templates/_macros.html:100 templates/_macros.html:265
|
||||
#: templates/_macros.html:272 templates/event/list.html:16
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#: templates/_macros.html:99 templates/_macros.html:233
|
||||
#: templates/_macros.html:102 templates/event/list.html:18
|
||||
msgid "Host"
|
||||
msgstr "Veranstalter"
|
||||
|
||||
#: templates/_macros.html:103 templates/_macros.html:237
|
||||
#: templates/admin_unit/update.html:26 templates/event/list.html:19
|
||||
#: templates/event_suggestion/list.html:16
|
||||
#: templates/event_suggestion/read.html:41
|
||||
#: templates/organization/create.html:27 templates/organization/update.html:27
|
||||
#: templates/organizer/create.html:25 templates/organizer/update.html:25
|
||||
#: templates/place/create.html:29 templates/place/update.html:29
|
||||
msgid "Location"
|
||||
msgstr "Standort"
|
||||
|
||||
#: templates/_macros.html:110 templates/_macros.html:278
|
||||
#: templates/_macros.html:114 templates/_macros.html:282
|
||||
#: templates/event/list.html:30
|
||||
msgid "Verified"
|
||||
msgstr "Verifiziert"
|
||||
|
||||
#: templates/_macros.html:123
|
||||
#: templates/_macros.html:127
|
||||
msgid "Show all events"
|
||||
msgstr "Alle Veranstaltungen anzeigen"
|
||||
|
||||
#: templates/_macros.html:139
|
||||
#: templates/_macros.html:143
|
||||
msgid "Show on Google Maps"
|
||||
msgstr "Auf Google Maps anzeigen"
|
||||
|
||||
#: templates/_macros.html:194
|
||||
#: templates/_macros.html:198
|
||||
msgid "Link"
|
||||
msgstr "Link"
|
||||
|
||||
#: templates/_macros.html:254 templates/event/create.html:13
|
||||
#: templates/_macros.html:258 templates/event/create.html:13
|
||||
#: templates/event/delete.html:13 templates/event/update.html:13
|
||||
#: templates/event_suggestion/read.html:13
|
||||
msgid "Event"
|
||||
msgstr "Veranstaltung"
|
||||
|
||||
#: templates/_macros.html:264
|
||||
#: templates/_macros.html:268
|
||||
#, python-format
|
||||
msgid "%(count)d event dates"
|
||||
msgstr "%(count)d Termine"
|
||||
|
||||
#: templates/_macros.html:306 templates/event/create.html:65
|
||||
#: templates/event/update.html:63 templates/place/create.html:20
|
||||
#: templates/_macros.html:309 templates/event/create.html:43
|
||||
#: templates/event/update.html:58 templates/place/create.html:20
|
||||
#: templates/place/update.html:20
|
||||
msgid "Place"
|
||||
msgstr "Ort"
|
||||
|
||||
#: templates/_macros.html:326 templates/_macros.html:346
|
||||
#: templates/_macros.html:329 templates/_macros.html:349
|
||||
msgid "Show directions"
|
||||
msgstr "Anreise planen"
|
||||
|
||||
#: templates/_macros.html:356
|
||||
msgid "Organizer"
|
||||
msgstr "Organisator"
|
||||
|
||||
#: templates/_macros.html:419
|
||||
#: templates/_macros.html:398
|
||||
msgid "Sign in with Google"
|
||||
msgstr "Mit Google anmelden"
|
||||
|
||||
#: templates/_macros.html:479
|
||||
#: templates/_macros.html:458
|
||||
msgid "Search location on Google"
|
||||
msgstr "Ort bei Google suchen"
|
||||
|
||||
#: templates/home.html:14
|
||||
#: templates/_macros.html:478 templates/manage/organizers.html:4
|
||||
msgid "Organizers"
|
||||
msgstr "Veranstalter"
|
||||
|
||||
#: templates/home.html:16
|
||||
msgid "Widget als iFrame einbetten"
|
||||
msgstr ""
|
||||
|
||||
#: templates/event/read.html:43 templates/event_date/list.html:4
|
||||
#: templates/event_date/list.html:8 templates/layout.html:50
|
||||
msgid "Event Dates"
|
||||
msgstr "Termine"
|
||||
|
||||
#: templates/admin_unit/read.html:30 templates/event/list.html:4
|
||||
#: templates/event/list.html:8 templates/event/read.html:10
|
||||
#: templates/event_date/read.html:16 templates/layout.html:51
|
||||
#: templates/organization/read.html:27 templates/place/read.html:22
|
||||
msgid "Events"
|
||||
msgstr "Veranstaltungen"
|
||||
|
||||
#: templates/layout.html:52 templates/place/list.html:3
|
||||
#: templates/place/list.html:7
|
||||
msgid "Places"
|
||||
msgstr "Orte"
|
||||
|
||||
#: templates/admin/admin.html:15 templates/admin/admin_units.html:3
|
||||
#: templates/admin/admin_units.html:10 templates/admin_unit/list.html:3
|
||||
#: templates/admin_unit/list.html:7 templates/layout.html:53
|
||||
#: templates/profile.html:10
|
||||
msgid "Admin Units"
|
||||
msgstr "Verwaltungseinheiten"
|
||||
|
||||
#: templates/admin_unit/read.html:27 templates/layout.html:54
|
||||
#: templates/organization/list.html:3 templates/organization/list.html:7
|
||||
#: templates/profile.html:32
|
||||
msgid "Organizations"
|
||||
msgstr "Organisationen"
|
||||
#: templates/layout.html:51
|
||||
msgid "Manage"
|
||||
msgstr "Verwaltung"
|
||||
|
||||
#: templates/developer/read.html:4 templates/developer/read.html:10
|
||||
#: templates/layout.html:55
|
||||
#: templates/layout.html:54
|
||||
msgid "Developer"
|
||||
msgstr "Entwickler"
|
||||
|
||||
#: templates/layout.html:64 templates/profile.html:3
|
||||
#: templates/layout.html:63 templates/profile.html:3
|
||||
msgid "Profile"
|
||||
msgstr "Profil"
|
||||
|
||||
#: templates/admin/admin.html:3 templates/admin/admin.html:9
|
||||
#: templates/admin/admin_units.html:9 templates/layout.html:67
|
||||
#: templates/admin/admin_units.html:9 templates/layout.html:66
|
||||
msgid "Admin"
|
||||
msgstr "Administration"
|
||||
|
||||
#: templates/layout.html:71
|
||||
#: templates/layout.html:70
|
||||
msgid "Logout"
|
||||
msgstr "Ausloggen"
|
||||
|
||||
#: templates/admin/admin.html:15 templates/admin/admin_units.html:3
|
||||
#: templates/admin/admin_units.html:10 templates/admin_unit/list.html:3
|
||||
#: templates/admin_unit/list.html:7 templates/manage/admin_units.html:3
|
||||
#: templates/profile.html:10
|
||||
msgid "Admin Units"
|
||||
msgstr "Verwaltungseinheiten"
|
||||
|
||||
#: templates/admin_unit/read.html:67 templates/admin_unit/read.html:89
|
||||
#: templates/organization/read.html:65 templates/profile.html:16
|
||||
#: templates/profile.html:38
|
||||
msgid "Roles"
|
||||
msgstr "Rollen"
|
||||
|
||||
#: templates/admin_unit/read.html:27 templates/organization/list.html:3
|
||||
#: templates/organization/list.html:7 templates/profile.html:32
|
||||
msgid "Organizations"
|
||||
msgstr "Organisationen"
|
||||
|
||||
#: templates/admin_unit/read.html:19 templates/organization/read.html:19
|
||||
#: templates/place/read.html:19
|
||||
msgid "Info"
|
||||
@ -574,13 +556,21 @@ msgstr "Info"
|
||||
msgid "Members"
|
||||
msgstr "Mitglieder"
|
||||
|
||||
#: templates/admin_unit/read.html:30 templates/event/list.html:4
|
||||
#: templates/event/list.html:8 templates/event/read.html:10
|
||||
#: templates/event_date/read.html:16 templates/organization/read.html:27
|
||||
#: templates/place/read.html:22
|
||||
msgid "Events"
|
||||
msgstr "Veranstaltungen"
|
||||
|
||||
#: templates/admin_unit/read.html:56
|
||||
msgid "You are a member of this admin unit."
|
||||
msgstr "Du bist Mitglied dieser Verwaltungseinheit"
|
||||
|
||||
#: templates/admin_unit/update.html:44 templates/event/create.html:97
|
||||
#: templates/event/update.html:94 templates/organization/create.html:45
|
||||
#: templates/organization/update.html:45 templates/place/create.html:44
|
||||
#: templates/admin_unit/update.html:44 templates/event/create.html:75
|
||||
#: templates/event/update.html:89 templates/organization/create.html:45
|
||||
#: templates/organization/update.html:45 templates/organizer/create.html:43
|
||||
#: templates/organizer/update.html:43 templates/place/create.html:44
|
||||
#: templates/place/update.html:44
|
||||
msgid "Additional information"
|
||||
msgstr "Zusätzliche Informationen"
|
||||
@ -589,7 +579,7 @@ msgstr "Zusätzliche Informationen"
|
||||
msgid "Event date"
|
||||
msgstr "Termin"
|
||||
|
||||
#: templates/event/create.html:85 templates/event/update.html:82
|
||||
#: templates/event/create.html:63 templates/event/update.html:77
|
||||
msgid "Target group"
|
||||
msgstr "Zielgruppe"
|
||||
|
||||
@ -601,28 +591,35 @@ msgstr "Diese Veranstaltung als nicht verifiziert markieren"
|
||||
msgid "Mark event as verified"
|
||||
msgstr "Diese Veranstaltung als verifiziert markieren"
|
||||
|
||||
#: templates/event_suggestion/list.html:3
|
||||
#: templates/event_suggestion/list.html:7
|
||||
msgid "Event suggestions"
|
||||
msgstr "Veranstaltungsvorschläge"
|
||||
#: templates/event/read.html:43 templates/event_date/list.html:4
|
||||
#: templates/event_date/list.html:8
|
||||
msgid "Event Dates"
|
||||
msgstr "Termine"
|
||||
|
||||
#: templates/event_suggestion/list.html:17
|
||||
#: templates/event_suggestion/read.html:86
|
||||
msgid "Created at"
|
||||
msgstr "Erstellt am"
|
||||
#: templates/manage/organizers.html:23
|
||||
msgid "Edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
#: templates/event_suggestion/read.html:22
|
||||
msgid "Event name"
|
||||
msgstr "Name"
|
||||
#: templates/manage/organizers.html:24
|
||||
msgid "Delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
#: templates/event_suggestion/read.html:69
|
||||
msgid "Contact"
|
||||
msgstr "Kontakt"
|
||||
#: templates/manage/organizers.html:25
|
||||
msgid "Assistents"
|
||||
msgstr "Assistenten"
|
||||
|
||||
#: templates/organization/create.html:16 templates/organization/update.html:16
|
||||
msgid "Organization"
|
||||
msgstr "Organisation"
|
||||
|
||||
#: templates/organization/read.html:54
|
||||
msgid "You are a member of this organization."
|
||||
msgstr "Du bist Mitglied dieser Organisation"
|
||||
|
||||
#: templates/place/list.html:3 templates/place/list.html:7
|
||||
msgid "Places"
|
||||
msgstr "Orte"
|
||||
|
||||
#: templates/widget/event_date/list.html:4
|
||||
msgid "Widget"
|
||||
msgstr "WIDGET"
|
||||
@ -661,3 +658,33 @@ msgstr "Finden"
|
||||
#~ msgid "Your Organizations"
|
||||
#~ msgstr "Deine Organisationen"
|
||||
|
||||
#~ msgid "Select existing host or enter organizer"
|
||||
#~ msgstr "Existierenden Veranstalter wählen oder Organisator eingeben"
|
||||
|
||||
#~ msgid "Suggest event"
|
||||
#~ msgstr "Veranstaltung vorschlagen"
|
||||
|
||||
#~ msgid "Event place"
|
||||
#~ msgstr "Veranstaltungsort"
|
||||
|
||||
#~ msgid "Event host"
|
||||
#~ msgstr "Veranstalter"
|
||||
|
||||
#~ msgid "Contact name"
|
||||
#~ msgstr "Kontakt Name"
|
||||
|
||||
#~ msgid "Contact email"
|
||||
#~ msgstr "Kontakt Email"
|
||||
|
||||
#~ msgid "Event suggestions"
|
||||
#~ msgstr "Veranstaltungsvorschläge"
|
||||
|
||||
#~ msgid "Created at"
|
||||
#~ msgstr "Erstellt am"
|
||||
|
||||
#~ msgid "Event name"
|
||||
#~ msgstr "Name"
|
||||
|
||||
#~ msgid "Contact"
|
||||
#~ msgstr "Kontakt"
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user