JSONB Feld über wtforms füllen

Django, Flask, Bottle, WSGI, CGI…
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: ein DateTime-Feld für eine Uhrzeit ist etwas überdimensioniert. Ich frage mich auch immer, warum Datenbankarchitekten immer so kryptische Namen vergeben müssen 'biz_listing'?
Was ist aus Sicht der Datenbank der Unterschied zwischen Vormittag und Nachmittag, wenn ich wissen will, ob ein Laden gerade geöffnet hat?
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

pillmuncher hat geschrieben:@meego: Was machst du mit Geschäften, die ganztägig geöffnet haben? Oder die Mittwoch Nachmittag geschlossen haben?
Ich dachte, die geben dann einfach am zeiten an (Beispiel: 9:30 - 18:30. Oder was meinst du?

@Sirius3: Wie würdest du es benennen? db.Time reicht wohl. Kein Unterschied für die Öffnungsabfrage, aber vielleicht für die Darstellung im Frontend?
BlackJack

@meego: Wenn die ganztägig geöffnet haben dann gibst Du also 18:30 für `closing_morning` an? Was wird in dem Fall dann bei `opening_afternoon` und `closing_afternoon` gespeichert und wie sieht die SQL-Anfrage aus ob ein Geschäft gerade offen hat oder die Abfrage der gerade offenen Geschäfte? Vergleich das mal mit einer Abfrage für den Fall das es pro ”Schicht” einen Dateneintrag gibt und nicht pro Geschäft einen mit zwei ”Schichten”.

Und was ist wenn es mehr als zwei ”Schichten” mit geschlossenen Zeiten dazwischen gibt? Wie bildest Du das ab?
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

tricky wird es auch, wenn es saisonal bedingten Öffnungszeiten gibt (z.B. in Urlaubsgebieten). Wenn man das berücksichtigen muss, muss die Tabelle noch anders aussehen. Wenn man's nicht berücksichtigen muss - Glück gehabt :-)

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Blackjack möchte die Tabelle also wie folgt verkürzen:

Code: Alles auswählen

class BusinessOpeningHours(db.Model):
    __tablename__ = 'business_opening_hours'
    id = db.Column(db.Integer, primary_key=True)
    business_listing_id = db.Column(db.Integer, db.ForeignKey('biz_listing.id'))
    day = db.Column(db.Integer, nullable=False) # 1 Mo, 2 Tu, 3 We, 4 Th, 5 Fr, 6 Sa, 7 Su
    opening = db.Column(db.Time)
    closing = db.Column(db.Time)
Keine Ahnung allerdings, wie man sowas dann einfach im Frontend (wtforms) abbildet.

@Noisy: Wir wollen die Sache jetzt nicht verkomplizieren. :mrgreen: Die Chance, das der Inhaber seinen Eintrag auch updated ist ohnehin ziemlich gering.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@meego: es kommt darauf an, was Du möchtest. Oder allgemeiner, was ein typischer Programmierer möchte. Er möchte einen möglichst einfachen, gut wartbaren Code, der möglichst wenig Sonderfälle berücksichtigen muß. Und wenn man für jeden Wochentag mehrere Einträge zuläßt, ist sowohl die Abfrage, ob ein Geschäft geöffnet ist einfacher, als mit Morgens- und Nachmittags-Zeiten, als auch flexibler, weil man beliebig viele Pausen machen kann. Die nächste Erkenntnis hat Dich auch schon fast erreicht: Formulargeneratoren sind nur für wirklich simple Formulare ein Hilfe. Alles andere muß man individuell Programmieren.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Keine Ahnung allerdings, wie man sowas dann einfach im Frontend (wtforms) abbildet.
IMHO gibt's zwei Ansätze:

1. Du stellst im Formular nur 1x Wochentag, Öffnungszeit, Schlusszeit dar und man muss pro Laden dann im Zweifelsfall x mal das Formularausfüllen. Dann kannst du auch Wtforms nutzen.
2. Du gestaltest die Seite so, dass du beliebig viele Formularfilter via JS einblenden kannst. Dann macht Wtforms serverseitig dafür nicht wirklich Sinn.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

@Sirius: Ja, bei den Queries bin ich noch nicht angekommen und entsprechend unerfahren. Also kann man das nicht mehr weiter vereinfachen?

@Noisefloor: Leider kann ich noch kein js, der Syntax ist: fürchterlich. Aber mehrmals dieselbe Website ausfüllen, kann sicherlich nicht die elegante Lösung sein.
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Leider kann ich noch kein js, der Syntax ist: fürchterlich.
Aber bei einem Webprojekt wie deinem ist es ziemlich unrealistisch, dass du ohne JS auskommst. Und jQuery & Co machen JS schon ziemlich erträglich.

Gruß, noisefloor
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Da gibt's also gar keine WTforms Klasse im Frontend, auch keine eigene, wie sie Sirius vor kurzem mal abgewandelt hat? Dann muss ich diese Funktionalität wohl erst einmal zurückstellen und jQuery lernen.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Bin jetzt zwar etwas weiter mit jQuery, allerdings bin ich mir nicht sicher, ob ich das so machen kann und dann irgendwie die Inputfelder an die DB weiterreicht (der Debugger beschwert sich auch schon mal, offenbar wegen den render_fields). Ich weiss auch nicht, ob ich dieser wtf-selectfields überhaupt über wtforms mehrmals gebrauchen kann. Was meint ihr dazu?:

Code: Alles auswählen

<script>
$("add_button").on('click', function() {
	var $html_string.html('
			<div class="row">
				<div class="input-field col s3 m2">
					{{ render_inputfield(form.day) }}
			    </div>
			    <div class="input-field col s3 m2 l1">
					<input type="text" name="time1" id="time_field" class="time" data-time-format="H:i" />
					<label for="time1">{{ _('von') }}</label>
			    </div>
				<div class="input-field col s3 m2 l1">
					<input type="text" name="time2" id="time_field" class="time" data-time-format="H:i" />
					<label for="time2">{{ _('bis') }}</label>
			    </div>
			   	<div class="input-field col s3 m2 l1">
					<input type="text" name="time3" id="time_field" class="time" data-time-format="H:i" />
					<label for="time3">{{ _('von') }}</label>
			    </div>
				<div class="input-field col s3 m2 l1">
					<input type="text" name="time4" id="time_field" class="time" data-time-format="H:i" />
					<label for="time4">{{ _('bis') }}</label>
			    </div>
			    <div class="input-field col s4 m4 l2">
			    	<a class="btn-floating waves-effect waves-light" id="add_button"><i class="material-icons">add</i></a>
			    </div>
	        </div>
		');
	$('#openinghours').append($html_string);

});
</script>
BlackJack

@meego: Wo wird denn `$html_string` definiert und warum steht da ``var`` davor? Das dürfte syntaktisch falsch sein.

Wie ist `render_inputfield()` denn definiert?

Das `id`-Attribut muss dokumentweit *eindeutig* sein. Bei Dir ist `time_field` nicht einmal innerhalb des HTML-Fragments eindeutig und bei jedem Klick auf die Schaltfläche zum hinzufügen werden neue Fragmente in das Dokument gebracht bei denen IDs enthalten sind die es bereits gibt.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Das macro render_inputfield wird importiert und funktioniert ausserhalb des scripts.

Code: Alles auswählen

<script>
$("add_button").on('click', function() {
	var html_string = $('<div class="row">).html('
				<div class="input-field col s3 m2">
					{{ render_inputfield(form.day) }}
			    </div>
			    <div class="input-field col s3 m2 l1">
					<input type="text" name="time1" id="time_field" class="time" data-time-format="H:i" />
					<label for="time1">{{ _('von') }}</label>
			    </div>
				<div class="input-field col s3 m2 l1">
					<input type="text" name="time2" id="time_field" class="time" data-time-format="H:i" />
					<label for="time2">{{ _('bis') }}</label>
			    </div>
			   	<div class="input-field col s3 m2 l1">
					<input type="text" name="time3" id="time_field" class="time" data-time-format="H:i" />
					<label for="time3">{{ _('von') }}</label>
			    </div>
				<div class="input-field col s3 m2 l1">
					<input type="text" name="time4" id="time_field" class="time" data-time-format="H:i" />
					<label for="time4">{{ _('bis') }}</label>
			    </div>
			    <div class="input-field col s4 m4 l2">
			    	<a class="btn-floating waves-effect waves-light" id="add_button"><i class="material-icons">add</i></a>
			    </div>
	        </div>
		');
	$('#openinghours').append(html_string);

});
</script>


Über die ids muss man sich wohl später Gedanken machen. Die Frage ist erst mal, ob das so überhaupt Sinn macht.
BlackJack

@meego: Das Templatesystem schaut nicht ob sich ein Platzhalter innerhalb eines <script>-Tags befindet oder nicht, das kann also eigentlich nicht sein dass es ausserhalb funktioniert, innerhalb aber nicht.
meego
User
Beiträge: 380
Registriert: Montag 4. März 2013, 14:36

Code: Alles auswählen

<div class="input-field col s3 m2">
     {{ render_inputfield(form.day) }}
</div>

<div class="input-field col s3 m2">
     {{ render_inputfield(form.day) }}
</div>
Wenn ich den 2. im Script herausnehme funktioniert es. Merkwürdig.
Antworten