aus Django.http Import JsonAntwort
aus Django.Verknüpfungen Import machen, umleiten
aus .Modelle Import Treffen, BlockierteDaten, Arbeitszeiten, Einstellungen
aus .Formen Import Terminvereinbarung, SpracheFormular
aus Django.Dienstprogramme.Übersetzung Import Text abrufen als _
aus Django.Kern.Post Import send_mail
aus Django.Vorlage.Lader Import render_to_string
aus Django.Konf Import Einstellungen
aus Django.Dienstprogramme Import Übersetzung
auf jeden set_language(Anfrage):
Wenn Anfrage.methode == "POST":
bilden = SpracheFormular(Anfrage.POST)
Wenn bilden.is_valid():
user_language = bilden.cleaned_data['Sprache']
Übersetzung.aktivieren(user_language)
Anfrage.Sitzung["Django-Sprache"] = user_language
zurückkehren umleiten('Standortauswahl')
anders:
drucken("Form ist ungültig!")
drucken(bilden.Fehler)
anders:
bilden = SpracheFormular()
zurückkehren machen(Anfrage, randevu_uygulamasi/set_language.html, {'bilden': bilden})
auf jeden location_choice(Anfrage):
Wenn Anfrage.methode == "POST":
chosen_location = Anfrage.POST.get('Standort')
Anfrage.Sitzung[„Ausgewählter_Standort“] = chosen_location
zurückkehren umleiten(„Termin erstellen“)
zurückkehren machen(Anfrage, randevu_uygulamasi/standort_auswahl.html)
auf jeden randevu_listesi(Anfrage):
Termine = Treffen.Objekte.alle().order_by('Geschichte', 'Moment')
zurückkehren machen(Anfrage, randevu_uygulamasi/randevu_liste.html, {'Termine': Termine})
auf jeden randevu_olustur(Anfrage, Standort=Keiner):
Wenn nicht Standort:
Standort = Anfrage.Sitzung.get(„Ausgewählter_Standort“, 'Standardstandort')
zurückkehren umleiten(„Termin erstellen“, Standort=Standort)
Wenn Anfrage.methode == "POST":
bilden = Terminvereinbarung(Anfrage.POST)
Wenn bilden.is_valid():
Geschichte = bilden.cleaned_data['Geschichte']
Moment = bilden.cleaned_data['Moment']
# Blockierte Daten Kontrolle
Wenn BlockierteDaten.Objekte.Filter(Datum=Geschichte).existiert():
bilden.add_error('Geschichte', "Für dieses Datum kann kein Termin vereinbart werden.")
zurückkehren machen(Anfrage, randevu_uygulamasi/randevu_olustur.html, {'bilden': bilden, 'Standort': Standort})
# Kontrolle der Arbeitszeiten und -tage
day_of_week = Geschichte.Wochentag()
versuchen:
working_hours = Arbeitszeiten.Objekte.erhalten(Tag=day_of_week, Standort=Standort)
Wenn Moment < working_hours.start_time oder Moment > working_hours.end_time:
bilden.add_error('Moment', Die gewählte Uhrzeit liegt außerhalb der Arbeitszeiten.)
zurückkehren machen(Anfrage, randevu_uygulamasi/randevu_olustur.html, {'bilden': bilden})
außer Arbeitszeiten.Existiert nicht:
bilden.add_error('Geschichte', Die Arbeitszeit für den ausgewählten Tag ist nicht definiert.)
zurückkehren machen(Anfrage, randevu_uygulamasi/randevu_olustur.html, {'bilden': bilden})
treffen = bilden.speichern(begehen=FALSCH)
treffen.Standort = Standort
treffen.speichern()
zurückkehren umleiten('Termindetail', randevu_id=treffen.Ausweis)
anders:
bilden = Terminvereinbarung()
zurückkehren machen(Anfrage, randevu_uygulamasi/randevu_olustur.html, {'bilden': bilden})
auf jeden get_working_hours(Anfrage, Standort, day_of_week):
# Wir holen die Standortinformationen aus der URL, daher ist die folgende Zeile nicht erforderlich.
# lokasyon = request.session.get('chosen_location', 'default_lokasyon')
versuchen:
working_hours = Arbeitszeiten.Objekte.erhalten(Tag=day_of_week, Standort=Standort)
zurückkehren JsonAntwort({
'Start': working_hours.start_time.strfzeit('%HM'),
'Ende': working_hours.end_time.strfzeit('%HM')
})
außer Arbeitszeiten.Existiert nicht:
zurückkehren JsonAntwort({'Fehler': Arbeitszeiten für diesen Tag nicht festgelegt}, Status=404)
auf jeden get_working_days(Anfrage, Standort):
# Wir holen die Standortinformationen aus der URL, daher ist die folgende Zeile nicht erforderlich.
# lokasyon = request.session.get('chosen_location', 'default_lokasyon')
working_days = Arbeitszeiten.Objekte.Filter(Standort=Standort).values_list('Tag', Wohnung=WAHR)
zurückkehren JsonAntwort(Liste(working_days), sicher=FALSCH)
auf jeden randevu_detay(Anfrage, randevu_id):
treffen = Treffen.Objekte.erhalten(Ausweis=randevu_id)
zurückkehren machen(Anfrage, randevu_anwendung/randevu_details.html, {'treffen': treffen})
auf jeden blocked_dates(Anfrage):
# Holen Sie sich die vom Benutzer ausgewählte Standortinformation
Standort = Anfrage.Sitzung.get(„Ausgewählter_Standort“, 'Standardstandort')
# Filtern Sie die blockierten Daten nach Standort
Termine = BlockierteDaten.Objekte.Filter(Standort=Standort).values_list('Datum', Wohnung=WAHR)
drucken(Termine) # Verschieben Sie diese Zeile hierher
# Konvertieren Sie die Daten in das String-Format
date_strings = [Datum.isoformat() für Datum In Termine]
# Geben Sie die Ergebnisse im JSON-Format zurück
zurückkehren JsonAntwort(date_strings, sicher=FALSCH)
auf jeden get_appointments_for_date(Anfrage):
selected_date = Anfrage.GET.get('Datum')
Termine = Treffen.Objekte.Filter(Geschichte=selected_date).values_list('Moment', Wohnung=WAHR)
zurückkehren JsonAntwort(Liste(Termine), sicher=FALSCH)
auf jeden get_appointment_interval(Anfrage, Standort):
Einstellungen = Einstellungen.Objekte.Filter(Standort=Standort).Erste()
Intervall = Einstellungen.Intervall Wenn Einstellungen anders 20 # Wenn die Einstellungen nicht vorgenommen wurden, standardmäßig 20 Minuten
zurückkehren JsonAntwort({"Intervall": Intervall})
,views.py-Datei,
# randevu_uygulamasi/urls.py
aus Django.URLs Import Weg
aus . Import Ansichten
aus Django.Konf.URLs.i18n Import i18n_patterns
URL-Muster = [
Weg('', Ansichten.randevu_listesi, Name='Terminliste'),
Weg(randevu//'', Ansichten.randevu_olustur, Name=„Termin erstellen“),
Weg(randevu_detail//, Ansichten.randevu_detay, Name='Termindetail'),
Weg('blockierte_daten/', Ansichten.blocked_dates, Name=„blockierte_Daten“),
Weg('Sprache festlegen/', Ansichten.set_language, Name='Sprache festlegen'),
Weg('Standortauswahl/', Ansichten.location_choice, Name='Standortauswahl'),
Weg(''de/arbeitszeiten_abfragen///''', Ansichten.get_working_hours, Name='Arbeitsstunden abrufen'),
Weg(de/arbeits tage//, Ansichten.get_working_days, Name='Arbeitstage abrufen'),
Weg(get_appointments_for_date/, Ansichten.get_appointments_for_date, Name=get_appointments_for_date),
Weg(get_appointment_interval/, Ansichten.get_appointment_interval, Name=get_appointment_interval),
]
,urls.py-Datei,
DOCTYPE html>
{% Belastung statisch %}
{% Belastung i18n %}
<Meta Name="Ansichtsfenster" Inhalt="width=device-width, initial-scale=1.0">
<Verknüpfung relativ="Stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
<Verknüpfung relativ="Stylesheet" href="{% statisch randevu_uygulamasi/css/styles.css %}">
<Verknüpfung relativ="Stylesheet" href="https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css">
<Skript Quelle="https://code.jquery.com/jquery-3.2.1.slim.min.js">Skript>
<Skript Quelle="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js">Skript>
<Skript Quelle="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js">Skript>
<Skript Quelle="https://cdn.jsdelivr.net/npm/flatpickr">Skript>
<div Klasse="Container py-5">
<h1 Klasse="mb-5 text-center display-4">{% trans „Neue Ernennung“ %}h1>
<div Klasse="Reihe justify-content-center">
<div Klasse="Spalte-12, Spalte-md-8">
<bilden Verfahren="Post">
{% csrf_token %}
{% für Feld In bilden %}
<div Klasse="Formulargruppe">
<Etikett für="angezeigteZeit" Klasse="col-lg-2 control-label display-4">{{ Feld.Etikett }}Etikett>
<div Klasse="col-lg-10">
{% Wenn Feld.Name != "Moment" %}
{{ Feld }}
{% anders %}
<Eingang Typ="Text" Ausweis="angezeigteZeit" Klasse="Formularkontrolle" schreibgeschützt>
<div Ausweis="zeitButtonsContainer">div>
<Eingang Typ="versteckt" Ausweis="id_saat" Name="Moment" Autovervollständigung="aus">
{% Ende %}
{% Wenn Feld.Fehler %}
<div Klasse="Warnung Warnung-Gefahr">
{{ Feld.Fehler|verbinden:", " }}
div>
{% Ende %}
div>
div>
{% Ende für %}
<div Klasse="Formulargruppe">
<div Klasse="col-lg-offset-2 col-lg-10">
<Taste Klasse="btn btn-primary btn-lg btn-block">{% trans "Termin erstellen" %}Taste>
div>
div>
bilden>
div>
div>
div>
<Stil>
.flatpickr-day.disabled, .flatpickr-day.disabled:hover {
Hintergrund: rot !wichtig;
cursor: nicht-erlaubt;
}
Stil>
<Skript>
$(dokumentieren).bereit(Funktion() {
$("#timeButtonsContainer").verstecken(); // Sayfa yüklendiğinde saat seçim butonlarını gizle
// Engellenen tarihleri al
$.getJSON('{% url "blocked_dates" %}', Funktion(geblockteTermine) {
// Çalışma günlerini al
$.getJSON('{% url "get_working_days" %}', Funktion(Arbeitstage) {
// Engellenen tarihlerle çalışma günlerini birleştir
Wo deaktivierteDaten = getDisabledDates(geblockteTermine, Arbeitstage);
// Flatpickr ayarları
$("#id_datum").Flachpicker({
Datumsformat: "J-m-t",
deaktivieren: deaktivierteDaten,
minDatum: "Heute",
beiÄnderung: Funktion(ausgewählteTermine, dateStr, Beispiel) {
Wenn (ausgewählteTermine.Länge > 0) {
Wo Wochentag = ausgewählteTermine[0].getDay();
$.getJSON('{% url "get_working_hours" day_of_week=0 %}'.ersetzen('0', Wochentag), Funktion(Arbeitsstunden) {
Wo verfügbareZeiten = Zeitfenster generieren(Arbeitsstunden.Start, Arbeitsstunden.Ende);
// Seçilen tarihte alınmış randevuları kontrol et
$.getJSON(/termine_für_datum_holen/, {Datum: dateStr}, Funktion(eingenommene Zeiten) {
verfügbareZeiten = verfügbareZeiten.Filter(Funktion(Zeit) {
zurückkehren !eingenommene Zeiten.beinhaltet(Zeit);
});
Zeitschaltflächen auffüllen(verfügbareZeiten);
});
});
}
}
});
});
});
});
// Engellenen tarihlerle çalışma günlerini birleştir
Funktion getDisabledDates(geblockteTermine, Arbeitstage) {
Wo deaktivierteDaten = geblockteTermine.Scheibe(); // Engellenen tarihleri kopyala
Wo aktuellesDatum = neu Datum();
für (Wo ich = 0; ich < 365; ich++) { // Bir yıl içindeki tüm tarihleri kontrol et
Wo Wochentag = aktuellesDatum.getDay();
Wenn (!Arbeitstage.beinhaltet(Wochentag)) {
deaktivierteDaten.drücken(formatDate(aktuellesDatum));
}
aktuellesDatum.Datum festlegen(aktuellesDatum.getDate() + 1);
}
zurückkehren deaktivierteDaten;
}
// Tarihi "YYYY-MM-DD" formatına dönüştür
Funktion formatDate(Datum) {
Wo Tag = Datum.getDate();
Wo Monat = Datum.Monat abrufen() + 1;
Wo Jahr = Datum.getFullYear();
zurückkehren Jahr + '-' + (Monat < 10 ? '0' : '') + Monat + '-' + (Tag < 10 ? '0' : '') + Tag;
}
Funktion Zeitschaltflächen auffüllen(verfügbareZeiten) {
Wo Container = $("#timeButtonsContainer");
Container.leer(); // Önceki butonları temizle
verfügbareZeiten.fürJedes(Funktion(Zeit) {
Wo Taste = $(" )
.Klasse hinzufügen("btn btn-primary time-button")
.Text(Zeit)
.klicken(Funktion() {
$("#aktuelle_id").Wert(Zeit); // Gizli saat input alanını doldur
$("#angezeigteZeit").Wert(Zeit); // Seçilen saati göster
Container.verstecken(); // Saat seçim butonlarını gizle
});
Container.Anhängen(Taste);
});
Container.zeigen(); // Saat butonlarını göster
// Saat seçim butonları gösterildiğinde, dış tıklama ile gizleme işlevini ekleyin
$(dokumentieren).klicken(Funktion(Ereignis) {
Wenn (!$(Ereignis.Ziel).am nächsten gelegen("#id_tarih, .zeit-button").Länge) {
Container.verstecken();
}
});
}
Funktion Zeitfenster generieren(Start, Ende) {
Wo Zeitfenster = [];
Wo aktuelle Zeit = neu Datum(`1970-01-01 ${Start}:00`);
Wo Endzeit = neu Datum(`1970-01-01 ${Ende}:00`);
// Interval değerini API'den alın
$.Ajax({
URL: /termin_intervall_abfragen/,
asynchron: FALSCH,
Datentyp: 'json',
Erfolg: Funktion(Daten) {
Wo Intervall = Daten.Intervall * 60000; // dakikayı milisaniyeye çevir
während (aktuelle Zeit < Endzeit) {
Wo Std. = Zeichenfolge(aktuelle Zeit.Stunden abrufen()).StraßeStart(2, '0');
Wo Minuten = Zeichenfolge(aktuelle Zeit.getMinutes()).StraßeStart(2, '0');
Zeitfenster.drücken(`${Std.}:${Minuten}`);
aktuelle Zeit = neu Datum(aktuelle Zeit.getTime() + Intervall);
}
}
});
zurückkehren Zeitfenster;
}
// Lokasyon değerini dinamik olarak formun action attribute'una ekleyen fonksiyon
Funktion updateFormActionWithLocation() {
Wo Standortwert = "{{ request.session.chosen_location }}"; // Django template dilini kullanarak session'dan lokasyon değerini alıyoruz
Wo formActionURL = "{% url 'randevu_olustur' lokasyon='PLACEHOLDER' %}".ersetzen('PLATZHALTER', Standortwert);
$("bilden").attr("Aktion", formActionURL);
}
// Formun submit edilmesi öncesinde lokasyon değerini formun action attribute'una ekleyin
$("bilden").einreichen(Funktion() {
updateFormActionWithLocation();
});
Skript>
,randevuolustur.html Datei