bygdis.fi

git clone https://git.tarina.org/bygdis.fi
Log | Files | Refs | README

commit 6981871c588f789076feb58114aca9dd9fbe49fc
parent 9ca80973f49fbb8cb00bc2edd4a367b49699c24d
Author: rob <rob@tarina.org>
Date:   Wed,  8 Mar 2023 15:22:17 +0200

boknings formulär

Diffstat:
Mpublic_html/html/admin.html | 12+++++++-----
Mpublic_html/html/boka.html | 39+++++----------------------------------
Apublic_html/html/fakturor.html | 19+++++++++++++++++++
Mpublic_html/html/index.html | 6++++--
Apublic_html/html/tack.html | 16++++++++++++++++
Mserver.py | 122++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------
6 files changed, 157 insertions(+), 57 deletions(-)

diff --git a/public_html/html/admin.html b/public_html/html/admin.html @@ -3,8 +3,9 @@ $def with (anslagstavla, saysomething, bokningar, doordebug, str, log, getDorrko <div id="default"> <br> <h1>Bygdis.fi</h1> - <a href="/event">Event</a> | <a href="/protokoll">Protokoll</a> | <a href="/static/mlinvoice">Fakturera</a> | <a href="/logout">Logga ut</a><br> - <a href="/bilder">Byyns fotoalbum</a> | <a href="/dorrkoder">Dörrkoder</a> | <a href="/boka">Boka</a> + <a href="/event">Event</a> | <a href="/protokoll">Protokoll</a> | <a href="/static/mlinvoice">Bokföring</a> | <a href="/logout">Logga ut</a><br> + <a href="/bilder">Byyns fotoalbum</a> | <a href="/dorrkoder">Dörrkoder</a> | <a href="/boka">Boka</a> | <a href="/fakturor">Fakturor</a> + <br> <br> $if doordebug.doorstate == 'False': @@ -24,12 +25,12 @@ $def with (anslagstavla, saysomething, bokningar, doordebug, str, log, getDorrko <h2>bokningar</h2> $for i in bokningar: <div class="anslagstavla" id="$i.bokningshash"> - <h3>$i.datumtid[:-8]</h3> + <h3>$i.datumtid[8:10]-$i.datumtid[5:7]-$i.datumtid[2:4]</h3> <b>$i.namn</b><br> evenemang: $i.event <br> $i.boka<br> epost: $i.epost <br> - tfn: $i.telefon <br> + telefon: $i.telefon <br> villkor godkända: $i.villkor <br> $i.privat <br><br> <a href="/admin?approve=$i.id" method="post">Godkänn</a> | @@ -42,12 +43,13 @@ $def with (anslagstavla, saysomething, bokningar, doordebug, str, log, getDorrko <br> status: $if i.approved: - godkändes $i.approved och lades till i event + godkändes $i.approved[8:10]-$i.approved[5:7]-$i.approved[2:4] och lades till i event $if i.doorcode: dörrkod $i.doorcode har skickats $if i.faktura: faktura har skickats $i.faktura </div> + <h2>Skriklåda</h2> <div class="anslagstavla"> <h4>Säg någå</h4> <form method="POST"> diff --git a/public_html/html/boka.html b/public_html/html/boka.html @@ -1,42 +1,12 @@ -$def with (boka) +$def with (boka,regler) <div id="container"> <div id="default"> <h2>Boka Bygdegården</h2> +<a href="javascript:history.back()">tibaks</a><br> <pre> -<b>Villkor och regler.</b> - -1. Max 230 personer får vistas samtidigt i lokalen. - -2. Rökning förbjuden inomhus. Ute på gården intill ingången finns kärl för fimpar. - -3. Fester kräver uppvisande av nöjestillstånd. Undantag är familjefester som tex. 50-årskalas, bröllop och dop där inget nöjestillstånd krävs. - -4. Den som hyr lokalen ansvarar för att lokalen och gårdsplanen är städad senast dagen efter tillställningen. - -<b>Städregler</b> - -1. Bord och stolar torkas och placeras på samma sätt som vid uthyrning av lokalen. - -2. Kökets arbetsytor torkas. - -3. Golven sopas med borste. - -4. Golvet i köket, serveringrummet, hallen och toaletter skall våttorkas. - -<u>5. Salsgolvet och scenen tvättas med lätt fuktad trasa!</u> - -6. Sopor sorteras i paff, glas och metall som förs till återvinningkärlen på gårdsplanen. Övriga sopor förs till sopkärlet vid köksingången. - -<b>Övriga villkor</b> - -1. Värmepumparnas inställningar skall sättas till ursprunglit läge efter användning. - -2. Eventuella skador på lokalen eller lösöret meddelas till lokalens bokningsansvariga (tel.0447624040) senast följande dag och skadorna ersättas till sitt fulla pris på räkning. - -3. Tillställningar som avbokas två veckor före tillställningen faktureras inte. Tillställningar som avbokas senare än två veckor före tillställningen faktureras till halva priset. Oavbokade tilställningar faktureras till fullt pris. - -4. Ifall lokalen lämnas ostädad, faktureras hyresgästen en städavgift. Denna avgift beror på städningens omfattning och fastställs enligt rådande avtal med städfirman som föreningen anlitar. +$:regler </pre> +<a href="boka?pdf=yes">ladda ner regler och villkor som pdf</a> <h2>Boknings formulär</h2> <div id="addevent"> <form method="POST"> @@ -44,6 +14,7 @@ $:boka.render() </form> </div> <b><p></p></b> +<a href="javascript:history.back()">tibaks</a> </div> </div> </div> diff --git a/public_html/html/fakturor.html b/public_html/html/fakturor.html @@ -0,0 +1,19 @@ +$def with (db,getkund,getmaksuja,round) + +<br> +<h1>Bygdis.fi</h1> +<a href="/admin"><<-----tibaks</a> +<h2>Fakturor</h2> +<a href="/fakturor?add=faktura">Lägg till</a> +<br> +<br> + <br> +$for i in db.select('mlinvoice_invoice'): + $getkund(i.company_id) + $i.invoice_date + $i.invoice_no + $i.due_date + $for p in getmaksuja(i.id): + $round(p.price,2) + <br> + diff --git a/public_html/html/index.html b/public_html/html/index.html @@ -4,12 +4,13 @@ $var upcomingevents = upcomingevents <div id="default"> $if displayname != '': <p>inloggad som <b><a href="/tuning">$displayname.displayname</a></b> ❃ | <a href="/logout">Logga ut</a> 🗝</p> + <a href="/admin">Till admin sidorna</a> $if displayname == '': <b><a href="/login">Logga in / kirjaudu sisään </a></b> <br> <h1>bygdis.fi</h1> <h2>Hommansby Ungdomsförening</h2> -<p><a href="#styrelsen">styrelsen</a> | <a href="#bokningar">bokningar</a> | <a href="/om">om sidan</a> | <a href="/bilder">Byyns fotoalbum</a> +<p><a href="#styrelsen">styrelsen</a> | <a href="#bokningar">bokningar</a> | <a href="/om">om sidan</a> | <a href="/bilder">Byyns fotoalbum</a> | <a href="/boka">Boka Bygdegården</a> $for i in upcomingevents: <div class=anslagstavla> <h3>$i.veckodag $i.datumtid[8:10] $i.datumtid[5:7] kl. $i.datumtid[10:16]</h3> @@ -26,7 +27,8 @@ Ronja Wiik, Benjamin Bäckman, Frieda Ramstedt, Johanna Granqvist, Tom Granqvist </div> <div id="bokningar"> <h1>Bokningar</h1> -Bokningar tas emot på <a href="tel:0447624040">0447624040</a><br> +Bokningar tas emot per telefon <a href="tel:0447624040">0447624040</a><br> +eller <a href="/boka">via denhär länken</a> eller per epost på info(ät)bygdis.fi<br> <h2>Veckoslut</h2> <b>fredagkväll till söndag eftermiddag</b><br> <h3>Hela huset</h3> diff --git a/public_html/html/tack.html b/public_html/html/tack.html @@ -0,0 +1,16 @@ +$def with () +<div id="container"> + <div id="default"> + <br> + <h1>Tack!</h1> + <h2>Vi har mottagit din förfrågan.</h2> + <img src="/static/bilder/thumb/2538b8616305288ad3527e8a7f391cdb.jpeg"><br> + <p>Vi tar kontakt innom snarast..</p> + <br> + Brådskande ärende:<br> + mail: info@bygdis.fi puh: 0447624040 + <br> + <a href="/">Tibaks</a> + <br> + </div> +</div> diff --git a/server.py b/server.py @@ -38,20 +38,25 @@ urls = ( "/remove/(.*)?","remove", "/tuning?", "tuning", "/senaste", "senaste", - "/admin", "admin", - "/boka", "boka", + "/admin?", "admin", + "/boka?", "boka", + "/fakturor?", "fakturor", "/dorrkoder?", "dorrkoder", "/nydorrkod?", "nydorrkod", "/dorrkoderapi?", "dorrkoderapi", "/register?", "register", "/forgotpass?", "forgotpass", "/ny", "ny", + "/tack", "tack", "/protokoll?", "protokoll", "/nope", "nope" ) postadmin = settings.postadmin postadmin_signature = settings.postadmin_signature +mlinvoice_db = settings.mlinvoice_db +mlinvoice_db_user = settings.mlinvoice_db_user +mlinvoice_db_pass = settings.mlinvoice_db_pass render = web.template.render(basedir + "/public_html/html/", base="base") render2 = web.template.render(basedir + "/public_html/html/", base="base2") render3 = web.template.render(basedir + "/public_html/html/", base="base3") @@ -59,6 +64,7 @@ web.config.debug = False app = web.application(urls, globals()) store = web.session.DiskStore(basedir + '/sessions') db = web.database(dbn="sqlite", db=basedir + "/db/bygdis.db") +db2 = web.database(dbn="mysql", db=mlinvoice_db, user=mlinvoice_db_user, pw=mlinvoice_db_pass) session = web.session.Session(app,store,initializer={'login': 0, 'user': '', 'backurl': '', 'bildsida': 0, 'search': ''}) def logged(): @@ -137,6 +143,30 @@ def getprotokoll_lastmodified(year): protokoll.append(a[0]) return protokoll +def md_to_html(markdownfile): + #make html from markdown + pandoc_html = ['pandoc', basedir + '/'+markdownfile, '-f', 'markdown', '-t', 'html'] + #make pdf from markdown + viewfile = subprocess.check_output(pandoc_html) + view = viewfile.decode() + return view + +def md_to_pdf(markdownfile): + randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() + pandoc_pdf = ['pandoc', '--verbose', basedir + '/'+markdownfile, '-f', 'markdown', '-V', 'papersize:a4', '-V', 'geometry:margin=0.8in','-s', '-o', basedir + '/public_html/static/pdf/'+randhash+'.pdf'] + subprocess.Popen(pandoc_pdf, cwd=basedir + '/public_html/static/pdf/') + time.sleep(3) + raise web.seeother('/static/pdf/'+randhash+'.pdf?nocache='+randhash) + +def md_to_text(markdownfile): + read_p=basedir + '/'+markdownfile + with open(read_p, 'rU') as file: + p_list=file.readlines() + pr='' + for p in p_list: + pr=pr+p + return pr + def adduser(name, password, mail): password = password.encode("utf-8") salt = bcrypt.gensalt() @@ -169,6 +199,20 @@ def getdisplayname(user): displayname = db.query("SELECT displayname FROM bildadmin WHERE name='"+user+"';")[0] return displayname.displayname +def getkund(id): + try: + name = db2.query("SELECT company_name FROM mlinvoice_company WHERE id='"+str(id)+"';")[0] + except: + name = '' + return name.company_name + +def getmaksuja(id): + try: + maksut = db2.query("SELECT * FROM mlinvoice_invoice_row WHERE invoice_id='"+str(id)+"';") + except: + maksut = '' + return maksut + def getbilder(): bilder = db.query("SELECT * FROM bilder ORDER BY uploaddate DESC") return bilder @@ -275,10 +319,20 @@ class admin(): #Send mail to user msg = "Hej " + bokning.namn + " tack din bokning godkändes, du får fakturan inom kort och en dörrkod när fakturan är betald. Tack!" sendmail(bokning.epost, 'Bokning av Bygdegården lyckades och är godkänd', msg) + #update booking db.update('bokningar', where='id="'+i.approve+'"', approved=datetime.datetime.now()) - raise web.seeother('/admin?kakka') + raise web.seeother('/admin') if i.sendrules != None: - raise web.seeother('/admin?kakka') + #Send mail to admin + bokning = db.select('bokningar', where='id="'+i.sendrules+'"')[0] + msg = "Skickar regler och villkor till " + bokning.namn + ' epost: ' + bokning.epost + sendmail(postadmin, 'Skickar villkor och regler', msg) + #Send mail to user + msg = "Hej " + bokning.namn + "! Gå in här https://bygdis.fi/boka?id="+bokning.bokningshash+" och godkänn regler och villkor för din bokning, du får fakturan inom kort och en dörrkod när fakturan är betald. Tack!" + sendmail(bokning.epost, 'Regler och Villkor för Bygdegården', msg) + #update booking + db.update('bokningar', where='id="'+i.sendrules+'"', approved="") + raise web.seeother('/admin') if i.fakturera != None: raise web.seeother('/admin?kakka') if i.doorcode != None: @@ -306,20 +360,25 @@ class admin(): raise web.seeother('/login') class boka(): + produkter = [] + p = db2.select('mlinvoice_product') + for i in p: + if i.product_name != None and i.deleted == 0: + produkter.append(i.product_name+' '+str(round(i.unit_price,2))+'€̈́') form = web.form.Form( web.form.Textbox('year', web.form.notnull, web.form.regexp('\d+', 'yyyy'), description="år:"), web.form.Textbox('day', web.form.notnull, web.form.regexp('\d+', 'dd'), description="dag:", autofocus="autofocus"), web.form.Textbox('month', web.form.notnull, web.form.regexp('\d+', 'MM'), description="månad:"), - web.form.Dropdown('boka', [u'Veckoslut hela huset (medlem) 200€', u'Veckoslut hela huset (icke medlem) 350 €', u'Veckoslut serveringsrummet och kök (medlem) 100€', u'Veckoslut serveringsrummet och kök (icke medlem) 150€', u'En dag hela huset (medlem) 100€', u'En dag hela huset (icke medlem) 150€', u'En dag serveringsrummet och kök (medlem) 80€', u'En dag serveringsrummet och kök (icke medlem) 120€'], web.form.notnull, description="bokning"), - web.form.Textarea('event', web.form.notnull, description="beskrivning:"), + web.form.Dropdown('boka', produkter, web.form.notnull, description="bokning"), + web.form.Textarea('event', web.form.notnull, description="event beskrivning och uppskattat antal gäster:"), web.form.Textbox('namn', web.form.notnull, description="namn:"), web.form.Textbox('epost', web.form.notnull, description="e-post:"), web.form.Textbox('telefon', web.form.regexp('\d+', 'nummer tack'), description="telefon:"), - web.form.Radio('villkor', [u'Nej', u'Ja'], web.form.notnull, description="Jag godkänner alla regler och villkor."), + web.form.Radio('villkor', [u'Nej', u'Ja'], web.form.notnull, description="Jag har läst och godkänner alla ovannämnda regler och villkor."), web.form.Radio('privat', [u'Privat', u'Offentligt'], web.form.notnull, description="Evenemanget som ordnas är:"), web.form.Button('Skicka')) def GET(self): - i = web.input(id=None, cp=None) + i = web.input(id=None, cp=None, pdf=None) form_boka = self.form() if i.id==None: now = datetime.datetime.now() @@ -328,11 +387,16 @@ class boka(): event = db.select('bokningar', where='bokningshash="'+i.id+'"')[0] now=datetime.datetime.strptime(event.datumtid, '%Y-%m-%d %H:%M:%S') form_boka.fill(year=now.year, month=now.month, day=now.day, boka=event.boka, event=event.event, namn=event.namn, epost=event.epost, telefon=event.telefon, villkor=event.villkor, privat=event.privat) - return render.boka(form_boka) + regler = md_to_html('protokoll/dokument/hyreskontrakt_regler_och_villkor.md') + if i.pdf != None: + md_to_pdf('protokoll/dokument/hyreskontrakt_regler_och_villkor.md') + return render.boka(form_boka, regler) def POST(self): form_boka = self.form() if not form_boka.validates(): - return render.boka(form_boka) + return render.nope() + #regler = md_to_html('protokoll/dokument/hyreskontrakt_regler_och_villkor.md') + #return render.boka(form_boka,regler) else: i = web.input(id=None, copyevent=None) try: @@ -344,10 +408,35 @@ class boka(): return render.nope() if i.id == None: bokningshash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() - db.insert('bokningar', datumtid=datum, boka=i.boka, event=i.event, namn=i.namn, epost=i.epost, telefon=i.telefon, villkor=i.villkor, privat=i.privat, bokningshash=bokningshash) + db.insert('bokningar', datumtid=datetime.datetime(year, month, day), boka=i.boka, event=i.event, namn=i.namn, epost=i.epost, telefon=i.telefon, villkor=i.villkor, privat=i.privat, bokningshash=bokningshash) else: - db.update('bokningar', where='bokningshash="'+i.id+'"', datumtid=datum, boka=i.boka, event=i.event, namn=i.namn, epost=i.epost, telefon=i.telefon, villkor=i.villkor, privat=i.privat) - raise web.seeother('/admin') + db.update('bokningar', where='bokningshash="'+i.id+'"', datumtid=datetime.datetime(year, month, day), boka=i.boka, event=i.event, namn=i.namn, epost=i.epost, telefon=i.telefon, villkor=i.villkor, privat=i.privat, approved='') + if i.villkor=='Ja': + #Send mail to admin + msg = "Ny bokning! " + i.namn + ' epost: ' + i.epost + sendmail(postadmin, 'Ny bokning!', msg) + #Send mail to user + rules_and_regulations = md_to_text('protokoll/dokument/hyreskontrakt_regler_och_villkor.md') + msg = "Hej " + i.namn + "! Tack för att du valde Bygdegården. Vi kontaktar dej som snarast om din boknings förfrågan och du får faktura per epost och en dörrkod när fakturan är betald. Tack! Här under är regler och villkor vilka du har läst och godkänner då du hyr av oss. \n\n" + rules_and_regulations + sendmail(i.epost, 'Regler och Villkor för Bygdegården', msg) + raise web.seeother('/tack') + +class tack(): + def GET(self): + return render.tack() + +class fakturor(): + def GET(self): + if session.login == 5: + #log = getDorrlog(0) + i = web.input(radera=None,uppdatera=None,fakturera=None) + #if i.radera != None: + # db.delete('fakturor', where='id="'+i.radera+'"') + # raise web.seeother('/fakturor') + #print(dorrkoder) + return render.fakturor(db2,getkund,getmaksuja,round) + else: + web.seeother('/') class event(): def GET(self): @@ -1149,10 +1238,11 @@ class protokoll(): viewfile = subprocess.check_output(pandoc_html) view = viewfile.decode() if webdata.pdf == "protokoll": - pandoc_pdf = ['pandoc', '--verbose', basedir + '/protokoll/' + webdata.year + '/' + protokoll[int(webdata.nr)], '-f', 'markdown', '-V', 'papersize:a4', '-V', 'geometry:margin=0.8in','-s', '-o', basedir + '/public_html/static/pdf/uf-protokoll.pdf'] - subprocess.Popen(pandoc_pdf, cwd=basedir + '/public_html/static/pdf/') randhash = hashlib.md5(str(random.getrandbits(256)).encode('utf-8')).hexdigest() - raise web.seeother('/static/pdf/uf-protokoll.pdf?nocache='+randhash) + pandoc_pdf = ['pandoc', '--verbose', basedir + '/protokoll/' + webdata.year + '/' + protokoll[int(webdata.nr)], '-f', 'markdown', '-V', 'papersize:a4', '-V', 'geometry:margin=0.8in','-s', '-o', basedir + '/public_html/static/pdf/'+randhash+'.pdf'] + subprocess.Popen(pandoc_pdf, cwd=basedir + '/public_html/static/pdf/') + time.sleep(3) + raise web.seeother('/static/pdf/'+randhash+'.pdf?nocache='+randhash) #read protokoll read_p=basedir + '/protokoll/' + webdata.year + '/' + protokoll[int(webdata.nr)] with open(read_p, 'rU') as file: