thiswebshoprules

git clone https://git.tarina.org/thiswebshoprules
Log | Files | Refs

server.py.html (70098B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      5 <title>server.py - getdafuckouttahere.net - Unnamed repository; edit this file &#39;description&#39; to name the repository.
      6 </title>
      7 <link rel="icon" type="image/png" href="../favicon.png" />
      8 <link rel="alternate" type="application/atom+xml" title="getdafuckouttahere.net Atom Feed" href="../atom.xml" />
      9 <link rel="alternate" type="application/atom+xml" title="getdafuckouttahere.net Atom Feed (tags)" href="../tags.xml" />
     10 <link rel="stylesheet" type="text/css" href="../style.css" />
     11 </head>
     12 <body>
     13 <table><tr><td><a href="../../"><img src="../logo.png" alt="" width="32" height="32" /></a></td><td><h1>getdafuckouttahere.net</h1><span class="desc">Unnamed repository; edit this file &#39;description&#39; to name the repository.
     14 </span></td></tr><tr><td></td><td>
     15 <a href="../log.html">Log</a> | <a href="../files.html">Files</a> | <a href="../refs.html">Refs</a></td></tr></table>
     16 <hr/>
     17 <div id="content">
     18 <p> server.py (30625B)</p><hr/><pre id="blob">
     19 <a href="#l1" class="line" id="l1">      1</a> #!/usr/bin/python3
     20 <a href="#l2" class="line" id="l2">      2</a> # -*- coding: utf-8 -*-
     21 <a href="#l3" class="line" id="l3">      3</a> 
     22 <a href="#l4" class="line" id="l4">      4</a> import time, datetime, os, sys
     23 <a href="#l5" class="line" id="l5">      5</a> 
     24 <a href="#l6" class="line" id="l6">      6</a> file_dir = os.path.dirname(__file__)
     25 <a href="#l7" class="line" id="l7">      7</a> sys.path.append(file_dir)
     26 <a href="#l8" class="line" id="l8">      8</a> 
     27 <a href="#l9" class="line" id="l9">      9</a> import json
     28 <a href="#l10" class="line" id="l10">     10</a> import requests
     29 <a href="#l11" class="line" id="l11">     11</a> import subprocess
     30 <a href="#l12" class="line" id="l12">     12</a> import web
     31 <a href="#l13" class="line" id="l13">     13</a> import hashlib
     32 <a href="#l14" class="line" id="l14">     14</a> import random
     33 <a href="#l15" class="line" id="l15">     15</a> import time
     34 <a href="#l16" class="line" id="l16">     16</a> import shutil
     35 <a href="#l17" class="line" id="l17">     17</a> import settings
     36 <a href="#l18" class="line" id="l18">     18</a> from PIL import Image
     37 <a href="#l19" class="line" id="l19">     19</a> from forex_python.bitcoin import BtcConverter
     38 <a href="#l20" class="line" id="l20">     20</a> from bitcoinrpc.authproxy import AuthServiceProxy, JSONRPCException
     39 <a href="#l21" class="line" id="l21">     21</a> 
     40 <a href="#l22" class="line" id="l22">     22</a> urls = (
     41 <a href="#l23" class="line" id="l23">     23</a>     &#39;/?&#39;, &#39;index&#39;,
     42 <a href="#l24" class="line" id="l24">     24</a>     &#39;/putinbag/(.*)&#39;, &#39;putinbag&#39;,
     43 <a href="#l25" class="line" id="l25">     25</a>     &#39;/dropitem/(.*)?&#39;, &#39;dropitem&#39;,
     44 <a href="#l26" class="line" id="l26">     26</a>     &#39;/payln/(.*)&#39;, &#39;payln&#39;,
     45 <a href="#l27" class="line" id="l27">     27</a>     &#39;/paybtc/(.*)&#39;, &#39;paybtc&#39;,
     46 <a href="#l28" class="line" id="l28">     28</a>     &#39;/payment/(.*)&#39;, &#39;payment&#39;,
     47 <a href="#l29" class="line" id="l29">     29</a>     &#39;/checkout&#39;, &#39;checkout&#39;,
     48 <a href="#l30" class="line" id="l30">     30</a>     &#39;/pending&#39;, &#39;pending&#39;,
     49 <a href="#l31" class="line" id="l31">     31</a>     &#39;/thankyou&#39;, &#39;thankyou&#39;,
     50 <a href="#l32" class="line" id="l32">     32</a>     &#39;/login&#39;, &#39;login&#39;,
     51 <a href="#l33" class="line" id="l33">     33</a>     &#39;/logout&#39;, &#39;logout&#39;,
     52 <a href="#l34" class="line" id="l34">     34</a>     &#39;/products/(.*)?&#39;, &#39;products&#39;,
     53 <a href="#l35" class="line" id="l35">     35</a>     &#39;/bigpic/(.*)?&#39;, &#39;bigpic&#39;,
     54 <a href="#l36" class="line" id="l36">     36</a>     &#39;/categories?&#39;, &#39;categories&#39;,
     55 <a href="#l37" class="line" id="l37">     37</a>     &#39;/op&#39;, &#39;op&#39;,
     56 <a href="#l38" class="line" id="l38">     38</a>     &#39;/bitcoin&#39;, &#39;bitcoin&#39;,
     57 <a href="#l39" class="line" id="l39">     39</a>     &#39;/shipping/(.*)&#39;, &#39;shipping&#39;,
     58 <a href="#l40" class="line" id="l40">     40</a>     &#39;/payments?&#39;, &#39;payments&#39;)
     59 <a href="#l41" class="line" id="l41">     41</a> 
     60 <a href="#l42" class="line" id="l42">     42</a> allowed = ((&quot;rbckman&quot;, &quot;secret&quot;),
     61 <a href="#l43" class="line" id="l43">     43</a>     (&quot;brkhelle&quot;, &quot;topsecret&quot;))
     62 <a href="#l44" class="line" id="l44">     44</a> 
     63 <a href="#l45" class="line" id="l45">     45</a> productsbad = ((&quot;GetDaFuckOuttaHere&quot;, 420.00),
     64 <a href="#l46" class="line" id="l46">     46</a>     (&quot;GetDaFuckOuttaHere Viewfinder&quot;, 80.00),
     65 <a href="#l47" class="line" id="l47">     47</a>     (&quot;Picamera&quot;, 30.00),
     66 <a href="#l48" class="line" id="l48">     48</a>     (&quot;Donation&quot;, 0.005))
     67 <a href="#l49" class="line" id="l49">     49</a> 
     68 <a href="#l50" class="line" id="l50">     50</a> bag = &#39;&#39;
     69 <a href="#l51" class="line" id="l51">     51</a> 
     70 <a href="#l52" class="line" id="l52">     52</a> #Load from settings
     71 <a href="#l53" class="line" id="l53">     53</a> 
     72 <a href="#l54" class="line" id="l54">     54</a> rpcauth = settings.rpcauth
     73 <a href="#l55" class="line" id="l55">     55</a> charge_url = settings.charge_url
     74 <a href="#l56" class="line" id="l56">     56</a> webmaster = settings.webmaster
     75 <a href="#l57" class="line" id="l57">     57</a> baseurl = settings.baseurl
     76 <a href="#l58" class="line" id="l58">     58</a> 
     77 <a href="#l59" class="line" id="l59">     59</a> 
     78 <a href="#l60" class="line" id="l60">     60</a> basedir = os.path.dirname(os.path.realpath(__file__))
     79 <a href="#l61" class="line" id="l61">     61</a> templatedir = basedir + &#39;/public_html/templates/&#39;
     80 <a href="#l62" class="line" id="l62">     62</a> staticdir = basedir + &#39;/public_html/static/&#39;
     81 <a href="#l63" class="line" id="l63">     63</a> web.config.debug = False
     82 <a href="#l64" class="line" id="l64">     64</a> app = web.application(urls, globals())
     83 <a href="#l65" class="line" id="l65">     65</a> store = web.session.DiskStore(basedir + &#39;/sessions&#39;)
     84 <a href="#l66" class="line" id="l66">     66</a> render = web.template.render(templatedir, base=&quot;base&quot;)
     85 <a href="#l67" class="line" id="l67">     67</a> renderop = web.template.render(templatedir, base=&quot;op&quot;)
     86 <a href="#l68" class="line" id="l68">     68</a> db = web.database(dbn=&#39;sqlite&#39;, db=basedir + &quot;/db/cyberpunkcafe.db&quot;)
     87 <a href="#l69" class="line" id="l69">     69</a> session = web.session.Session(app,store,initializer={&#39;login&#39;:0, &#39;privilege&#39;:0, &#39;bag&#39;:[], &#39;sessionkey&#39;:0})
     88 <a href="#l70" class="line" id="l70">     70</a> 
     89 <a href="#l71" class="line" id="l71">     71</a> #----------- Database setup -------------
     90 <a href="#l72" class="line" id="l72">     72</a> 
     91 <a href="#l73" class="line" id="l73">     73</a> #Remeber to store Euros in cents
     92 <a href="#l74" class="line" id="l74">     74</a> 
     93 <a href="#l75" class="line" id="l75">     75</a> #CREATE TABLE products (id integer PRIMARY KEY, name text NOT NULL, description text, price integer NOT NULL, available integer, sold integer, priority integer, dateadded integer, datelastsold integer, daterunout integer, dateavailable integer);
     94 <a href="#l76" class="line" id="l76">     76</a> 
     95 <a href="#l77" class="line" id="l77">     77</a> #CREATE TABLE shipping (id integer PRIMARY KEY, country text NOT NULL, cost integer NOT NULL, days integer NOT NULL);
     96 <a href="#l78" class="line" id="l78">     78</a> 
     97 <a href="#l79" class="line" id="l79">     79</a> #should rename to customer 
     98 <a href="#l80" class="line" id="l80">     80</a> #CREATE TABLE pending (id integer PRIMARY KEY, invoice_key text NOT NULL, country text NOT NULL, firstname text NOT NULL, lastname text NOT NULL, address text NOT NULL, town text NOT NULL, postalcode integer NOT NULL, email text NOT NULL, dateadded integer)
     99 <a href="#l81" class="line" id="l81">     81</a> 
    100 <a href="#l82" class="line" id="l82">     82</a> #CREATE TABLE invoices (id INT AUTO_INCREMENT, invoice_key TEXT, btc TEXT, ln TEXT, products TEXT, payment TEXT, amount INT, totsats INT, timestamp TIMESTAMP, status TEXT, datepaid TIMESTAMP, dateshipped TIMESTAMP);
    101 <a href="#l83" class="line" id="l83">     83</a> 
    102 <a href="#l84" class="line" id="l84">     84</a> 
    103 <a href="#l85" class="line" id="l85">     85</a> def logged():
    104 <a href="#l86" class="line" id="l86">     86</a>     if session.login == 1:
    105 <a href="#l87" class="line" id="l87">     87</a>         return True
    106 <a href="#l88" class="line" id="l88">     88</a>     else:
    107 <a href="#l89" class="line" id="l89">     89</a>         return False
    108 <a href="#l90" class="line" id="l90">     90</a> 
    109 <a href="#l91" class="line" id="l91">     91</a> def sendmail(email, subject, msg):
    110 <a href="#l92" class="line" id="l92">     92</a>     #Send mail
    111 <a href="#l93" class="line" id="l93">     93</a>     echomsg = subprocess.Popen((&#39;echo&#39;, msg), stdout=subprocess.PIPE)
    112 <a href="#l94" class="line" id="l94">     94</a>     sendmsg = subprocess.check_output((&#39;mail&#39;, &#39;-r&#39;, &#39;rob@tarina.org&#39;, &#39;-s&#39;, subject, email), stdin=echomsg.stdout)
    113 <a href="#l95" class="line" id="l95">     95</a>     echomsg.wait()
    114 <a href="#l96" class="line" id="l96">     96</a>     #subprocess.call([&#39;echo&#39;, msg, &#39;|&#39;, &#39;mail&#39;, &#39;-r&#39;, &#39;rob@tarina.org&#39;,&#39;-s&#39;, subject, email])
    115 <a href="#l97" class="line" id="l97">     97</a> 
    116 <a href="#l98" class="line" id="l98">     98</a> def createinvoice(amount, description, invoice_key):
    117 <a href="#l99" class="line" id="l99">     99</a>     #Cents to EUR
    118 <a href="#l100" class="line" id="l100">    100</a>     amount = str(amount*1000)
    119 <a href="#l101" class="line" id="l101">    101</a>     invoice_details = {&quot;msatoshi&quot;:amount, &quot;description&quot;: &quot;{}&quot;.format(description)}
    120 <a href="#l102" class="line" id="l102">    102</a>     print(invoice_details)
    121 <a href="#l103" class="line" id="l103">    103</a>     resp = requests.post(charge_url+&#39;/invoice/&#39;, json=invoice_details)
    122 <a href="#l104" class="line" id="l104">    104</a>     #print(resp.json())
    123 <a href="#l105" class="line" id="l105">    105</a>     return resp.json()
    124 <a href="#l106" class="line" id="l106">    106</a> 
    125 <a href="#l107" class="line" id="l107">    107</a> def getinvoice(id):
    126 <a href="#l108" class="line" id="l108">    108</a>     resp = requests.get(charge_url+&#39;/invoice/&#39;+id)
    127 <a href="#l109" class="line" id="l109">    109</a>     print(resp.json())
    128 <a href="#l110" class="line" id="l110">    110</a>     return resp.json()
    129 <a href="#l111" class="line" id="l111">    111</a> 
    130 <a href="#l112" class="line" id="l112">    112</a> def callsubprocess(cmd):
    131 <a href="#l113" class="line" id="l113">    113</a>     subprocess.call(cmd.split())
    132 <a href="#l114" class="line" id="l114">    114</a> 
    133 <a href="#l115" class="line" id="l115">    115</a> def dropitems(d):
    134 <a href="#l116" class="line" id="l116">    116</a>     i = getproduct(d)
    135 <a href="#l117" class="line" id="l117">    117</a>     db.update(&#39;products&#39;, where=&quot;id=&#39;&quot;+str(i.id)+&quot;&#39;&quot;, available=i.available+1)
    136 <a href="#l118" class="line" id="l118">    118</a>     product = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39; AND product=&#39;&quot;+str(i.id)+&quot;&#39;;&quot;)[0]
    137 <a href="#l119" class="line" id="l119">    119</a>     if product.quantity &gt; 1:
    138 <a href="#l120" class="line" id="l120">    120</a>         db.update(&#39;customerbag&#39;, where=&quot;sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39; and product=&#39;&quot;+str(i.id)+&quot;&#39;&quot;, quantity=product.quantity-1)
    139 <a href="#l121" class="line" id="l121">    121</a>     else:
    140 <a href="#l122" class="line" id="l122">    122</a>         db.query(&quot;DELETE FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39; AND product=&#39;&quot;+str(i.id)+&quot;&#39;;&quot;)
    141 <a href="#l123" class="line" id="l123">    123</a> 
    142 <a href="#l124" class="line" id="l124">    124</a> def addtobag(p):
    143 <a href="#l125" class="line" id="l125">    125</a>     i = getproduct(p)
    144 <a href="#l126" class="line" id="l126">    126</a>     if i.available &gt; 0:
    145 <a href="#l127" class="line" id="l127">    127</a>         #session.bag += (i.name, i.price, i.id),
    146 <a href="#l128" class="line" id="l128">    128</a>         db.update(&#39;products&#39;, where=&quot;id=&#39;&quot;+str(i.id)+&quot;&#39;&quot;, available=i.available-1)
    147 <a href="#l129" class="line" id="l129">    129</a>         product = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39; AND product=&#39;&quot;+str(i.id)+&quot;&#39;;&quot;)
    148 <a href="#l130" class="line" id="l130">    130</a>         if product:
    149 <a href="#l131" class="line" id="l131">    131</a>             product = product[0]
    150 <a href="#l132" class="line" id="l132">    132</a>             print(product)
    151 <a href="#l133" class="line" id="l133">    133</a>             db.update(&#39;customerbag&#39;, where=&quot;sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39; and product=&#39;&quot;+str(i.id)+&quot;&#39;&quot;, quantity=product.quantity+1)
    152 <a href="#l134" class="line" id="l134">    134</a>             print(&#39;gwtdafaakouttahere&#39;)
    153 <a href="#l135" class="line" id="l135">    135</a>         else:
    154 <a href="#l136" class="line" id="l136">    136</a>             db.insert(&#39;customerbag&#39;, sessionkey=session.sessionkey, product=i.id, price=i.price, quantity=1, timeadded=datetime.datetime.now())
    155 <a href="#l137" class="line" id="l137">    137</a> 
    156 <a href="#l138" class="line" id="l138">    138</a> def productname(productid):
    157 <a href="#l139" class="line" id="l139">    139</a>     try:
    158 <a href="#l140" class="line" id="l140">    140</a>         name = db.query(&quot;SELECT name FROM products WHERE id=&#39;&quot;+str(productid)+&quot;&#39;;&quot;)[0]
    159 <a href="#l141" class="line" id="l141">    141</a>     except:
    160 <a href="#l142" class="line" id="l142">    142</a>         return &#39;&#39;
    161 <a href="#l143" class="line" id="l143">    143</a>     return name.name
    162 <a href="#l144" class="line" id="l144">    144</a> 
    163 <a href="#l145" class="line" id="l145">    145</a> def getproduct(productid):
    164 <a href="#l146" class="line" id="l146">    146</a>     try:
    165 <a href="#l147" class="line" id="l147">    147</a>         product = db.query(&quot;SELECT * FROM products WHERE id=&#39;&quot;+str(productid)+&quot;&#39;;&quot;)[0]
    166 <a href="#l148" class="line" id="l148">    148</a>     except:
    167 <a href="#l149" class="line" id="l149">    149</a>         return &#39;&#39;
    168 <a href="#l150" class="line" id="l150">    150</a>     return product
    169 <a href="#l151" class="line" id="l151">    151</a> 
    170 <a href="#l152" class="line" id="l152">    152</a> def getavailable(productid):
    171 <a href="#l153" class="line" id="l153">    153</a>     try:
    172 <a href="#l154" class="line" id="l154">    154</a>         name = db.query(&quot;SELECT available FROM products WHERE id=&#39;&quot;+str(productid)+&quot;&#39;;&quot;)[0]
    173 <a href="#l155" class="line" id="l155">    155</a>     except:
    174 <a href="#l156" class="line" id="l156">    156</a>         return &#39;&#39;
    175 <a href="#l157" class="line" id="l157">    157</a>     return name.available
    176 <a href="#l158" class="line" id="l158">    158</a> 
    177 <a href="#l159" class="line" id="l159">    159</a> def checkforoldbags():
    178 <a href="#l160" class="line" id="l160">    160</a>     print(&#39;checking for old bags&#39;)
    179 <a href="#l161" class="line" id="l161">    161</a>     bags = db.select(&#39;customerbag&#39;)
    180 <a href="#l162" class="line" id="l162">    162</a>     for bag in bags:
    181 <a href="#l163" class="line" id="l163">    163</a>         if datetime.datetime.now() - bag.timeadded &gt; datetime.timedelta(hours=1):
    182 <a href="#l164" class="line" id="l164">    164</a>             print(datetime.datetime.now() - bag.timeadded)
    183 <a href="#l165" class="line" id="l165">    165</a>             print(datetime.timedelta(hours=1))
    184 <a href="#l166" class="line" id="l166">    166</a>             print(&quot;Fuck&quot;)
    185 <a href="#l167" class="line" id="l167">    167</a>             product = getproduct(bag.product)
    186 <a href="#l168" class="line" id="l168">    168</a>             print(&#39;found a bag at door! goddamit, got to put &#39; + str(bag.quantity) + &#39; x &#39;  + product.name + &#39; back on the shelf&#39;)
    187 <a href="#l169" class="line" id="l169">    169</a>             if product.available &gt; 1:
    188 <a href="#l170" class="line" id="l170">    170</a>                 q = product.available + bag.quantity
    189 <a href="#l171" class="line" id="l171">    171</a>             else:
    190 <a href="#l172" class="line" id="l172">    172</a>                 q = bag.quantity
    191 <a href="#l173" class="line" id="l173">    173</a>             db.update(&#39;products&#39;, where=&quot;id=&#39;&quot;+str(bag.product)+&quot;&#39;&quot;, available=str(q))
    192 <a href="#l174" class="line" id="l174">    174</a>             db.query(&quot;DELETE FROM customerbag WHERE sessionkey=&#39;&quot; + bag.sessionkey + &quot;&#39;&quot;)
    193 <a href="#l175" class="line" id="l175">    175</a> 
    194 <a href="#l176" class="line" id="l176">    176</a> def checkavailable():
    195 <a href="#l177" class="line" id="l177">    177</a>     print(&#39;check items from availability&#39;)
    196 <a href="#l178" class="line" id="l178">    178</a>     bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey + &quot;&#39;&quot;)
    197 <a href="#l179" class="line" id="l179">    179</a>     for i in bag:
    198 <a href="#l180" class="line" id="l180">    180</a>         q = getavailable(i.product)
    199 <a href="#l181" class="line" id="l181">    181</a>         soldout = q - i.quantity
    200 <a href="#l182" class="line" id="l182">    182</a>         if soldout &lt; 0:
    201 <a href="#l183" class="line" id="l183">    183</a>             web.seeother(&#39;/?error=soldout&#39;)
    202 <a href="#l184" class="line" id="l184">    184</a>         else:
    203 <a href="#l185" class="line" id="l185">    185</a>             return
    204 <a href="#l186" class="line" id="l186">    186</a> 
    205 <a href="#l187" class="line" id="l187">    187</a> def sold():
    206 <a href="#l188" class="line" id="l188">    188</a>     print(&#39;remove items from availability&#39;)
    207 <a href="#l189" class="line" id="l189">    189</a>     bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey + &quot;&#39;&quot;)
    208 <a href="#l190" class="line" id="l190">    190</a>     for i in bag:
    209 <a href="#l191" class="line" id="l191">    191</a>         q = getavailable(i.product)
    210 <a href="#l192" class="line" id="l192">    192</a>         soldout = q - i.quantity
    211 <a href="#l193" class="line" id="l193">    193</a>         if soldout &lt; 0:
    212 <a href="#l194" class="line" id="l194">    194</a>             web.seeother(&#39;/?error=soldout&#39;)
    213 <a href="#l195" class="line" id="l195">    195</a>         else:
    214 <a href="#l196" class="line" id="l196">    196</a>             db.update(&#39;products&#39;, where=&quot;id=&#39;&quot;+str(i.product)+&quot;&#39;&quot;, available=str(q - i.quantity))
    215 <a href="#l197" class="line" id="l197">    197</a> 
    216 <a href="#l198" class="line" id="l198">    198</a> 
    217 <a href="#l199" class="line" id="l199">    199</a> def organizepics(product):
    218 <a href="#l200" class="line" id="l200">    200</a>     imgdir = basedir+&#39;/public_html/static/img/&#39; + str(product) + &#39;/&#39;
    219 <a href="#l201" class="line" id="l201">    201</a>     imgdirlist = [imgdir, imgdir + &#39;web/&#39;, imgdir + &#39;thumb/&#39;]
    220 <a href="#l202" class="line" id="l202">    202</a>     for d in imgdirlist:
    221 <a href="#l203" class="line" id="l203">    203</a>         pics = next(os.walk(d))[2]
    222 <a href="#l204" class="line" id="l204">    204</a>         organized_nr = 0
    223 <a href="#l205" class="line" id="l205">    205</a>         for s in sorted(pics):
    224 <a href="#l206" class="line" id="l206">    206</a>             if &#39;.jpeg&#39; in s:
    225 <a href="#l207" class="line" id="l207">    207</a>                 #print(s)
    226 <a href="#l208" class="line" id="l208">    208</a>                 unorganized_nr = int(s[0:3])
    227 <a href="#l209" class="line" id="l209">    209</a>                 if organized_nr == unorganized_nr:
    228 <a href="#l210" class="line" id="l210">    210</a>                     print(&#39;correcto pic numbering&#39;)
    229 <a href="#l211" class="line" id="l211">    211</a>                     pass
    230 <a href="#l212" class="line" id="l212">    212</a>                 if organized_nr != unorganized_nr:
    231 <a href="#l213" class="line" id="l213">    213</a>                     print(&#39;false, correcting pic from &#39; + str(unorganized_nr) + &#39; to &#39; + str(organized_nr))
    232 <a href="#l214" class="line" id="l214">    214</a>                     mv = &#39;mv &#39; + d + str(unorganized_nr).zfill(3) + &#39;.jpeg&#39;
    233 <a href="#l215" class="line" id="l215">    215</a>                     mv2 = &#39; &#39; + d + str(organized_nr).zfill(3) + &#39;.jpeg&#39;
    234 <a href="#l216" class="line" id="l216">    216</a>                     os.system(mv + mv2)
    235 <a href="#l217" class="line" id="l217">    217</a>                 organized_nr += 1
    236 <a href="#l218" class="line" id="l218">    218</a> 
    237 <a href="#l219" class="line" id="l219">    219</a> def getpendinginfo():
    238 <a href="#l220" class="line" id="l220">    220</a>     try:
    239 <a href="#l221" class="line" id="l221">    221</a>         pendinginfo = db.select(&#39;pending&#39;, where=&quot;invoice_key=&#39;&quot; + session.sessionkey + &quot;&#39;&quot;, what=&#39;country, firstname, lastname, address, town, postalcode, email&#39;)[0]
    240 <a href="#l222" class="line" id="l222">    222</a>     except:
    241 <a href="#l223" class="line" id="l223">    223</a>         pendinginfo = &#39;&#39;
    242 <a href="#l224" class="line" id="l224">    224</a>     return pendinginfo
    243 <a href="#l225" class="line" id="l225">    225</a> 
    244 <a href="#l226" class="line" id="l226">    226</a> class index():
    245 <a href="#l227" class="line" id="l227">    227</a>     def GET(self):
    246 <a href="#l228" class="line" id="l228">    228</a>         checkforoldbags()
    247 <a href="#l229" class="line" id="l229">    229</a>         i = web.input(dropitem=None, putinbag=None)
    248 <a href="#l230" class="line" id="l230">    230</a>         if session.sessionkey == 0:
    249 <a href="#l231" class="line" id="l231">    231</a>             session.sessionkey = hashlib.sha256(str(random.getrandbits(256)).encode(&#39;utf-8&#39;)).hexdigest()
    250 <a href="#l232" class="line" id="l232">    232</a>         if i.dropitem != None:
    251 <a href="#l233" class="line" id="l233">    233</a>             session.bag = dropitems(int(i.dropitem))
    252 <a href="#l234" class="line" id="l234">    234</a>             print(session.bag)
    253 <a href="#l235" class="line" id="l235">    235</a>         if i.putinbag != None:
    254 <a href="#l236" class="line" id="l236">    236</a>             addtobag(i.putinbag)
    255 <a href="#l237" class="line" id="l237">    237</a>             return web.seeother(&#39;/#&#39; + i.putinbag)
    256 <a href="#l238" class="line" id="l238">    238</a>         print(&#39;Cyberpunk cafe&#39;)
    257 <a href="#l239" class="line" id="l239">    239</a>         #print(session.bag)
    258 <a href="#l240" class="line" id="l240">    240</a>         b = BtcConverter()
    259 <a href="#l241" class="line" id="l241">    241</a>         listproducts = db.query(&quot;SELECT * FROM products ORDER BY priority DESC&quot;)
    260 <a href="#l242" class="line" id="l242">    242</a>         imgfiles = []
    261 <a href="#l243" class="line" id="l243">    243</a>         products = []
    262 <a href="#l244" class="line" id="l244">    244</a>         # Search product images
    263 <a href="#l245" class="line" id="l245">    245</a>         for i in listproducts:
    264 <a href="#l246" class="line" id="l246">    246</a>             productimages = [&#39;&#39;]
    265 <a href="#l247" class="line" id="l247">    247</a>             imgdir = staticdir + &#39;img/&#39; + str(i.id) + &#39;/web/&#39;
    266 <a href="#l248" class="line" id="l248">    248</a>             try:
    267 <a href="#l249" class="line" id="l249">    249</a>                 productimages = sorted(os.listdir(imgdir))
    268 <a href="#l250" class="line" id="l250">    250</a>                 if len(productimages) == 0:
    269 <a href="#l251" class="line" id="l251">    251</a>                     productimages = [&#39;&#39;]
    270 <a href="#l252" class="line" id="l252">    252</a>                 print(productimages)
    271 <a href="#l253" class="line" id="l253">    253</a>             except FileNotFoundError:
    272 <a href="#l254" class="line" id="l254">    254</a>                 print(&#39;No product images&#39;)
    273 <a href="#l255" class="line" id="l255">    255</a>                 pass
    274 <a href="#l256" class="line" id="l256">    256</a>             i.update({&#39;images&#39;:productimages})
    275 <a href="#l257" class="line" id="l257">    257</a>             products.append(i)
    276 <a href="#l258" class="line" id="l258">    258</a>         try:
    277 <a href="#l259" class="line" id="l259">    259</a>             bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    278 <a href="#l260" class="line" id="l260">    260</a>         except:
    279 <a href="#l261" class="line" id="l261">    261</a>             bag = []
    280 <a href="#l262" class="line" id="l262">    262</a>         return render.index(products, b, bag, str, int, float, session.sessionkey, productname)
    281 <a href="#l263" class="line" id="l263">    263</a> 
    282 <a href="#l264" class="line" id="l264">    264</a> class putinbag:
    283 <a href="#l265" class="line" id="l265">    265</a>     def GET(self, p):
    284 <a href="#l266" class="line" id="l266">    266</a>         addtobag(p)
    285 <a href="#l267" class="line" id="l267">    267</a>         raise web.seeother(&#39;/&#39;)
    286 <a href="#l268" class="line" id="l268">    268</a> 
    287 <a href="#l269" class="line" id="l269">    269</a> class dropitem():
    288 <a href="#l270" class="line" id="l270">    270</a>     def GET(self, d):
    289 <a href="#l271" class="line" id="l271">    271</a>         p = web.input()
    290 <a href="#l272" class="line" id="l272">    272</a>         i = 0
    291 <a href="#l273" class="line" id="l273">    273</a>         dropitems(int(d))
    292 <a href="#l274" class="line" id="l274">    274</a>         return web.seeother(&#39;/#&#39;+d)
    293 <a href="#l275" class="line" id="l275">    275</a> 
    294 <a href="#l276" class="line" id="l276">    276</a> class bigpic():
    295 <a href="#l277" class="line" id="l277">    277</a>     def GET(self, i):
    296 <a href="#l278" class="line" id="l278">    278</a>         print(&#39;faaaakyeee &#39; + i)
    297 <a href="#l279" class="line" id="l279">    279</a>         p = web.input(pic=None)
    298 <a href="#l280" class="line" id="l280">    280</a>         if p.pic != None:
    299 <a href="#l281" class="line" id="l281">    281</a>             return render.bigpic(p.pic, i)
    300 <a href="#l282" class="line" id="l282">    282</a> 
    301 <a href="#l283" class="line" id="l283">    283</a> class checkout:
    302 <a href="#l284" class="line" id="l284">    284</a>     t = []
    303 <a href="#l285" class="line" id="l285">    285</a>     shippingcountries = db.select(&#39;shipping&#39;, what=&#39;country&#39;, order=&#39;country ASC&#39;)
    304 <a href="#l286" class="line" id="l286">    286</a>     shippingcountries = list(shippingcountries)
    305 <a href="#l287" class="line" id="l287">    287</a>     t.append(&#39;NO-SHIPPING&#39;)
    306 <a href="#l288" class="line" id="l288">    288</a>     for i in shippingcountries:
    307 <a href="#l289" class="line" id="l289">    289</a>         if i.country != &#39;NO-SHIPPING&#39;:
    308 <a href="#l290" class="line" id="l290">    290</a>             t.append(i.country)
    309 <a href="#l291" class="line" id="l291">    291</a>     form = web.form.Form(
    310 <a href="#l292" class="line" id="l292">    292</a>     web.form.Dropdown(&#39;country&#39;, t, web.form.notnull, description=&quot;Country&quot;),
    311 <a href="#l293" class="line" id="l293">    293</a>     web.form.Textbox(&#39;firstname&#39;, web.form.notnull, description=&quot;First Name:&quot;),
    312 <a href="#l294" class="line" id="l294">    294</a>     web.form.Textbox(&#39;lastname&#39;, web.form.notnull, description=&quot;Last Name:&quot;),
    313 <a href="#l295" class="line" id="l295">    295</a>     web.form.Textbox(&#39;address&#39;, web.form.notnull, description=&quot;Shipping Address:&quot;),
    314 <a href="#l296" class="line" id="l296">    296</a>     web.form.Textbox(&#39;town&#39;, web.form.notnull, description=&quot;Town / City:&quot;),
    315 <a href="#l297" class="line" id="l297">    297</a>     web.form.Textbox(&#39;postalcode&#39;, web.form.regexp(&#39;\d+&#39;, &#39;number thanx!&#39;), web.form.notnull, description=&quot;Postalcode / zip&quot;),
    316 <a href="#l298" class="line" id="l298">    298</a>     web.form.Textbox(&#39;email&#39;, web.form.notnull, description=&quot;Email:&quot;),
    317 <a href="#l299" class="line" id="l299">    299</a>     web.form.Button(&#39;Calculate shipping cost&#39;))
    318 <a href="#l300" class="line" id="l300">    300</a> 
    319 <a href="#l301" class="line" id="l301">    301</a>     def GET(self):
    320 <a href="#l302" class="line" id="l302">    302</a>         #checkavailable()
    321 <a href="#l303" class="line" id="l303">    303</a>         checkoutform = self.form()
    322 <a href="#l304" class="line" id="l304">    304</a>         pendinginfo = getpendinginfo()
    323 <a href="#l305" class="line" id="l305">    305</a>         if pendinginfo:
    324 <a href="#l306" class="line" id="l306">    306</a>             checkoutform.fill(country=pendinginfo.country, firstname=pendinginfo.firstname, lastname=pendinginfo.lastname, address=pendinginfo.address, town=pendinginfo.town, postalcode=pendinginfo.postalcode, email=pendinginfo.email)
    325 <a href="#l307" class="line" id="l307">    307</a>         b = BtcConverter()
    326 <a href="#l308" class="line" id="l308">    308</a>         bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    327 <a href="#l309" class="line" id="l309">    309</a>         return render.checkout(checkoutform, bag, b, productname, float)
    328 <a href="#l310" class="line" id="l310">    310</a>     def POST(self):
    329 <a href="#l311" class="line" id="l311">    311</a>         checkoutform = self.form()
    330 <a href="#l312" class="line" id="l312">    312</a>         pendinginfo = getpendinginfo()
    331 <a href="#l313" class="line" id="l313">    313</a>         i = web.input()
    332 <a href="#l314" class="line" id="l314">    314</a>         if i.country != &#39;NO-SHIPPING&#39;:
    333 <a href="#l315" class="line" id="l315">    315</a>             if not checkoutform.validates():
    334 <a href="#l316" class="line" id="l316">    316</a>                 b = BtcConverter()
    335 <a href="#l317" class="line" id="l317">    317</a>                 return render.checkout(checkoutform, session.bag, b)
    336 <a href="#l318" class="line" id="l318">    318</a>         if pendinginfo:
    337 <a href="#l319" class="line" id="l319">    319</a>             db.update(&#39;pending&#39;, where=&quot;invoice_key=&#39;&quot; + session.sessionkey +&quot;&#39;&quot;, country=i.country, firstname=i.firstname, lastname=i.lastname, address=i.address, town=i.town, postalcode=i.postalcode, email=i.email, dateadded=datetime.datetime.now())
    338 <a href="#l320" class="line" id="l320">    320</a>         else:
    339 <a href="#l321" class="line" id="l321">    321</a>             db.insert(&#39;pending&#39;, invoice_key=session.sessionkey, country=i.country, firstname=i.firstname, lastname=i.lastname, address=i.address, town=i.town, postalcode=i.postalcode, email=i.email, dateadded=datetime.datetime.now())
    340 <a href="#l322" class="line" id="l322">    322</a>         raise web.seeother(&#39;/pending&#39;)
    341 <a href="#l323" class="line" id="l323">    323</a> 
    342 <a href="#l324" class="line" id="l324">    324</a> class pending:
    343 <a href="#l325" class="line" id="l325">    325</a>     form = web.form.Form(
    344 <a href="#l326" class="line" id="l326">    326</a>     web.form.Dropdown(&#39;payment&#39;, [&#39;Bitcoin Lightning&#39;, &#39;Bitcoin&#39;], web.form.notnull, description=&quot;Select payment method&quot;),
    345 <a href="#l327" class="line" id="l327">    327</a>     web.form.Button(&#39;Pay&#39;))
    346 <a href="#l328" class="line" id="l328">    328</a>     def GET(self):
    347 <a href="#l329" class="line" id="l329">    329</a>         #checkavailable()
    348 <a href="#l330" class="line" id="l330">    330</a>         pendingform = self.form()
    349 <a href="#l331" class="line" id="l331">    331</a>         pendinginfo = getpendinginfo()
    350 <a href="#l332" class="line" id="l332">    332</a>         if pendinginfo:
    351 <a href="#l333" class="line" id="l333">    333</a>             shippinginfo = db.select(&#39;shipping&#39;, where=&quot;country=&#39;&quot; + pendinginfo.country + &quot;&#39;&quot;, what=&#39;price, days&#39;)[0]
    352 <a href="#l334" class="line" id="l334">    334</a>         b = BtcConverter()
    353 <a href="#l335" class="line" id="l335">    335</a>         bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    354 <a href="#l336" class="line" id="l336">    336</a>         return render.pending(session.sessionkey, pendingform, pendinginfo, shippinginfo, bag, b, productname, float)
    355 <a href="#l337" class="line" id="l337">    337</a>     def POST(self):
    356 <a href="#l338" class="line" id="l338">    338</a>         pendingform = self.form()
    357 <a href="#l339" class="line" id="l339">    339</a>         pendinginfo = getpendinginfo()
    358 <a href="#l340" class="line" id="l340">    340</a>         if pendinginfo:
    359 <a href="#l341" class="line" id="l341">    341</a>             shippinginfo = db.select(&#39;shipping&#39;, where=&quot;country=&#39;&quot; + pendinginfo.country + &quot;&#39;&quot;, what=&#39;price, days&#39;)[0]
    360 <a href="#l342" class="line" id="l342">    342</a>             i = web.input()
    361 <a href="#l343" class="line" id="l343">    343</a>             #if session.bag != []:
    362 <a href="#l344" class="line" id="l344">    344</a>             totalamount = 0
    363 <a href="#l345" class="line" id="l345">    345</a>             description = &#39;&#39;
    364 <a href="#l346" class="line" id="l346">    346</a>             bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    365 <a href="#l347" class="line" id="l347">    347</a>             comma = &#39;&#39;
    366 <a href="#l348" class="line" id="l348">    348</a>             for s in bag:
    367 <a href="#l349" class="line" id="l349">    349</a>                 totalamount += s.price
    368 <a href="#l350" class="line" id="l350">    350</a>                 description += comma + str(s.quantity) + &#39; x &#39; + productname(s.product)
    369 <a href="#l351" class="line" id="l351">    351</a>                 comma = &#39;, &#39;
    370 <a href="#l352" class="line" id="l352">    352</a>             totalamount += shippinginfo.price
    371 <a href="#l353" class="line" id="l353">    353</a>             b = BtcConverter()
    372 <a href="#l354" class="line" id="l354">    354</a>             totsats = int(b.convert_to_btc(float(totalamount/100), &#39;EUR&#39;) * 100000000)
    373 <a href="#l355" class="line" id="l355">    355</a>             totbtc = int(b.convert_to_btc(float(totalamount/100), &#39;EUR&#39;))
    374 <a href="#l356" class="line" id="l356">    356</a>             print(str(totalamount) + &#39; | &#39; +  description)
    375 <a href="#l357" class="line" id="l357">    357</a>             print(str(totsats) + &#39; | &#39; +  description)
    376 <a href="#l358" class="line" id="l358">    358</a>             #else:
    377 <a href="#l359" class="line" id="l359">    359</a>             #    web.seeother(&#39;/&#39;)
    378 <a href="#l360" class="line" id="l360">    360</a>             #make lightning invoice
    379 <a href="#l361" class="line" id="l361">    361</a>             invoice = createinvoice(totsats, description, session.sessionkey)
    380 <a href="#l362" class="line" id="l362">    362</a>             callsubprocess(&#39;qrencode -s 5 -o &#39;+ staticdir + &#39;qr/&#39; + invoice[&#39;id&#39;]+&#39;.png &#39; + invoice[&#39;payreq&#39;])
    381 <a href="#l363" class="line" id="l363">    363</a>             #make bitcoin address
    382 <a href="#l364" class="line" id="l364">    364</a>             bitcoinrpc = AuthServiceProxy(rpcauth)
    383 <a href="#l365" class="line" id="l365">    365</a>             newaddress = bitcoinrpc.getnewaddress(&#39;GetDaFuckOuttaHere Butik&#39;)
    384 <a href="#l366" class="line" id="l366">    366</a>             bitcoinrpc = None
    385 <a href="#l367" class="line" id="l367">    367</a>             btcuri = &#39;bitcoin:&#39; + newaddress + &#39;?amount=&#39; + str(totbtc) + &#39;&amp;label=&#39; + description
    386 <a href="#l368" class="line" id="l368">    368</a>             callsubprocess(&#39;qrencode -s 5 -o &#39;+ staticdir + &#39;qr/&#39; + newaddress +&#39;.png &#39; + btcuri)
    387 <a href="#l369" class="line" id="l369">    369</a>             try:
    388 <a href="#l370" class="line" id="l370">    370</a>                 db.query(&quot;DELETE FROM invoices WHERE invoice_key=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    389 <a href="#l371" class="line" id="l371">    371</a>             except:
    390 <a href="#l372" class="line" id="l372">    372</a>                 print(&#39;no old invoices to delete&#39;)
    391 <a href="#l373" class="line" id="l373">    373</a>             db.insert(&#39;invoices&#39;, invoice_key=session.sessionkey, btc=newaddress, ln=invoice[&#39;id&#39;], products=description, payment=i.payment, amount=totalamount, totsats=totsats, timestamp=time.strftime(&#39;%Y-%m-%d %H:%M:%S&#39;))
    392 <a href="#l374" class="line" id="l374">    374</a>             # send mail to op
    393 <a href="#l375" class="line" id="l375">    375</a>             msg = &#39;You got a new order, from &#39; + pendinginfo.firstname + &#39; &#39; + pendinginfo.lastname + &#39; from &#39; + pendinginfo.country + &#39; email: &#39; + pendinginfo.email + &#39; this dude wantz &#39; + description + &#39; for &#39; + str(int(totalamount/100)) + &#39;€ &#39; + &#39; with &#39; + i.payment
    394 <a href="#l376" class="line" id="l376">    376</a>             sendmail(webmaster, &#39;GetDaFuckOuttaHere Shop&#39;, msg)
    395 <a href="#l377" class="line" id="l377">    377</a>             # send mail to customer
    396 <a href="#l378" class="line" id="l378">    378</a>             if i.payment == &#39;Bitcoin&#39;:
    397 <a href="#l379" class="line" id="l379">    379</a>                 paymentlink = &#39;paybtc/&#39;
    398 <a href="#l380" class="line" id="l380">    380</a>             if i.payment == &#39;Bitcoin Lightning&#39;:
    399 <a href="#l381" class="line" id="l381">    381</a>                 paymentlink = &#39;payln/&#39;
    400 <a href="#l382" class="line" id="l382">    382</a>             if pendinginfo.email != &#39;&#39;:
    401 <a href="#l383" class="line" id="l383">    383</a>                 msg = &quot;Thank you for ordering &quot; + description + &quot; at GetDaFuckOuttaHere Shop, we&#39;ll be processing your order as soon as possible and send it to &quot; + pendinginfo.firstname + &#39; &#39; + pendinginfo.lastname + &#39;, &#39; + pendinginfo.address + &#39;, &#39; + str(pendinginfo.postalcode) + &#39;, &#39; + pendinginfo.town + &#39;, &#39; + pendinginfo.country + &#39;. To pay/view status of your order please visit &#39; + baseurl + paymentlink + session.sessionkey
    402 <a href="#l384" class="line" id="l384">    384</a>                 sendmail(pendinginfo.email, &#39;GetDaFuckOuttaHere Shop&#39;, msg)
    403 <a href="#l385" class="line" id="l385">    385</a>             if i.payment == &#39;Bitcoin&#39;:
    404 <a href="#l386" class="line" id="l386">    386</a>                 return web.seeother(&#39;/paybtc/&#39; + session.sessionkey)
    405 <a href="#l387" class="line" id="l387">    387</a>             if i.payment == &#39;Bitcoin Lightning&#39;:
    406 <a href="#l388" class="line" id="l388">    388</a>                 return web.seeother(&#39;/payln/&#39; + session.sessionkey)
    407 <a href="#l389" class="line" id="l389">    389</a>         else:
    408 <a href="#l390" class="line" id="l390">    390</a>             return web.seeother(&#39;/&#39;)
    409 <a href="#l391" class="line" id="l391">    391</a> 
    410 <a href="#l392" class="line" id="l392">    392</a> class payln:
    411 <a href="#l393" class="line" id="l393">    393</a>     def GET(self, invoice_key):
    412 <a href="#l394" class="line" id="l394">    394</a>         #checkavailable()
    413 <a href="#l395" class="line" id="l395">    395</a>         invoice = db.select(&#39;invoices&#39;, where=&quot;invoice_key=&#39;&quot; + invoice_key + &quot;&#39;&quot;, what=&#39;invoice_key, btc, ln, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped&#39;)[0]
    414 <a href="#l396" class="line" id="l396">    396</a>         lninvoice = getinvoice(invoice.ln)
    415 <a href="#l397" class="line" id="l397">    397</a>         bag = db.query(&quot;SELECT * FROM customerbag WHERE sessionkey=&#39;&quot; + session.sessionkey +&quot;&#39;;&quot;)
    416 <a href="#l398" class="line" id="l398">    398</a>         if invoice_key == session.sessionkey:
    417 <a href="#l399" class="line" id="l399">    399</a>             return render.payln(lninvoice, invoice, bag, productname, float)
    418 <a href="#l400" class="line" id="l400">    400</a>         else:
    419 <a href="#l401" class="line" id="l401">    401</a>             raise web.seeother(&#39;/?error=timeout&#39;)
    420 <a href="#l402" class="line" id="l402">    402</a>     def POST(self, id):
    421 <a href="#l403" class="line" id="l403">    403</a>         data = web.data()
    422 <a href="#l404" class="line" id="l404">    404</a>         data = data.decode(&#39;utf8&#39;).replace(&quot;&#39;&quot;, &#39;&quot;&#39;)
    423 <a href="#l405" class="line" id="l405">    405</a>         data = json.loads(data)
    424 <a href="#l406" class="line" id="l406">    406</a>         print(data)
    425 <a href="#l407" class="line" id="l407">    407</a>         if data[&#39;status&#39;] == &#39;paid&#39;:
    426 <a href="#l408" class="line" id="l408">    408</a>             print(&quot;Hurray it worked&quot;)
    427 <a href="#l409" class="line" id="l409">    409</a>             sold()
    428 <a href="#l410" class="line" id="l410">    410</a>             return render.thankyou(id)
    429 <a href="#l411" class="line" id="l411">    411</a> 
    430 <a href="#l412" class="line" id="l412">    412</a> class paybtc:
    431 <a href="#l413" class="line" id="l413">    413</a>     def GET(self, invoice_key):
    432 <a href="#l414" class="line" id="l414">    414</a>         invoice = db.select(&#39;invoices&#39;, where=&quot;invoice_key=&#39;&quot; + invoice_key + &quot;&#39;&quot;, what=&#39;invoice_key, btc, ln, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped&#39;)[0]
    433 <a href="#l415" class="line" id="l415">    415</a>         totbtc = float(invoice.totsats * 0.00000001)
    434 <a href="#l416" class="line" id="l416">    416</a>         btcaddress = invoice.btc
    435 <a href="#l417" class="line" id="l417">    417</a>         btcuri = &#39;bitcoin:&#39; + btcaddress + &#39;?amount=&#39; + str(totbtc) + &#39;&amp;label=&#39; + invoice.products
    436 <a href="#l418" class="line" id="l418">    418</a>         bitcoinrpc = AuthServiceProxy(rpcauth)
    437 <a href="#l419" class="line" id="l419">    419</a>         showpayment = bitcoinrpc.listreceivedbyaddress(0, True, True, btcaddress)
    438 <a href="#l420" class="line" id="l420">    420</a>         bitcoinrpc = None
    439 <a href="#l421" class="line" id="l421">    421</a>         if showpayment:
    440 <a href="#l422" class="line" id="l422">    422</a>             for i in showpayment:
    441 <a href="#l423" class="line" id="l423">    423</a>                 confirmations = int(i[&#39;confirmations&#39;])
    442 <a href="#l424" class="line" id="l424">    424</a>                 print(str(confirmations))
    443 <a href="#l425" class="line" id="l425">    425</a>             if invoice.datepaid == None and confirmations &gt; 6:
    444 <a href="#l426" class="line" id="l426">    426</a>                 msg = &#39;GetDaFuckOuttaHere order update! someone sent you Bitcoin! &#39; + baseurl + &#39;/paybtc/&#39; + invoice.invoice_key
    445 <a href="#l427" class="line" id="l427">    427</a>                 print(msg)
    446 <a href="#l428" class="line" id="l428">    428</a>                 sendmail(webmaster, &#39;GetDaFuckOuttaHere Shop&#39;, msg)
    447 <a href="#l429" class="line" id="l429">    429</a>                 db.update(&#39;invoices&#39;, where=&quot;invoice_key=&#39;&quot; + invoice.invoice_key + &quot;&#39;&quot;, status=&#39;paid&#39;, datepaid=time.strftime(&#39;%Y-%m-%d %H:%M:%S&#39;))
    448 <a href="#l430" class="line" id="l430">    430</a>         return render.paybtc(invoice, btcaddress, btcuri, showpayment)
    449 <a href="#l431" class="line" id="l431">    431</a> 
    450 <a href="#l432" class="line" id="l432">    432</a> class payments:
    451 <a href="#l433" class="line" id="l433">    433</a>     def GET(self):
    452 <a href="#l434" class="line" id="l434">    434</a>         w = web.input()
    453 <a href="#l435" class="line" id="l435">    435</a>         if w:
    454 <a href="#l436" class="line" id="l436">    436</a>             db.update(&#39;invoices&#39;, where=&quot;invoice_key=&#39;&quot; + w.key + &quot;&#39;&quot;, status=w.status)
    455 <a href="#l437" class="line" id="l437">    437</a>             #get the right invoice send mail
    456 <a href="#l438" class="line" id="l438">    438</a>             customer = db.select(&#39;pending&#39;, where=&quot;invoice_key=&#39;&quot; + w.key + &quot;&#39;&quot;, what=&#39;country, firstname, lastname, address, town, postalcode, email&#39;)[0]
    457 <a href="#l439" class="line" id="l439">    439</a>             payment = db.select(&#39;invoices&#39;, where=&quot;invoice_key=&#39;&quot; + w.key + &quot;&#39;&quot;, what=&#39;btc, ln, invoice_key, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped&#39;)[0]
    458 <a href="#l440" class="line" id="l440">    440</a>             if payment.payment == &#39;Bitcoin&#39;:
    459 <a href="#l441" class="line" id="l441">    441</a>                 paylink = &#39;paybtc/&#39;
    460 <a href="#l442" class="line" id="l442">    442</a>             elif payment.payment == &#39;Bitcoin Lightning&#39;:
    461 <a href="#l443" class="line" id="l443">    443</a>                 paylink = &#39;payln/&#39;
    462 <a href="#l444" class="line" id="l444">    444</a>             if w.status == &#39;thankyou&#39;:
    463 <a href="#l445" class="line" id="l445">    445</a>                 msg=&quot;Hi &quot; + customer.firstname + &quot; &quot; + customer.lastname + &quot;, thank you for ordering. You can track the status of your order at &quot; + baseurl + paylink + payment.invoice_key
    464 <a href="#l446" class="line" id="l446">    446</a>                 sendmail(customer.email, &#39;GetDaFuckOuttaHere Shop, a thank you!&#39;, msg)
    465 <a href="#l447" class="line" id="l447">    447</a>             elif w.status == &#39;shipped&#39;:
    466 <a href="#l448" class="line" id="l448">    448</a>                 msg=&quot;Hi &quot; + customer.firstname + &quot; &quot; + customer.lastname + &quot;, your order has been shipped!. You can track the status of your order at &quot; + baseurl + paylink + payment.invoice_key
    467 <a href="#l449" class="line" id="l449">    449</a>                 sendmail(customer.email, &#39;GetDaFuckOuttaHere Shop, order shipped!&#39;, msg)
    468 <a href="#l450" class="line" id="l450">    450</a>         paymentdict = {}
    469 <a href="#l451" class="line" id="l451">    451</a>         listpayments = []
    470 <a href="#l452" class="line" id="l452">    452</a>         payments = db.select(&#39;invoices&#39;, what=&#39;btc, ln, invoice_key, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped&#39;, order=&#39;timestamp DESC&#39;)
    471 <a href="#l453" class="line" id="l453">    453</a>         for i in payments:
    472 <a href="#l454" class="line" id="l454">    454</a>             pending = db.select(&#39;pending&#39;, where=&quot;invoice_key=&#39;&quot; + i.invoice_key + &quot;&#39;&quot;, what=&#39;country, firstname, lastname, address, town, postalcode, email&#39;)
    473 <a href="#l455" class="line" id="l455">    455</a>             i.update(pending[0])
    474 <a href="#l456" class="line" id="l456">    456</a>             listpayments.append(i)
    475 <a href="#l457" class="line" id="l457">    457</a>         return renderop.payments(listpayments)
    476 <a href="#l458" class="line" id="l458">    458</a> 
    477 <a href="#l459" class="line" id="l459">    459</a> class payment:
    478 <a href="#l460" class="line" id="l460">    460</a>     def GET(self, invoice_key):
    479 <a href="#l461" class="line" id="l461">    461</a>         id = db.where(&#39;invoices&#39;, invoice_key=invoice_key)[0][&#39;ln&#39;]
    480 <a href="#l462" class="line" id="l462">    462</a>         invoice = getinvoice(id)
    481 <a href="#l463" class="line" id="l463">    463</a>         return render.payment(invoice)
    482 <a href="#l464" class="line" id="l464">    464</a> 
    483 <a href="#l465" class="line" id="l465">    465</a> class thankyou:
    484 <a href="#l466" class="line" id="l466">    466</a>     def GET(self, id):
    485 <a href="#l467" class="line" id="l467">    467</a>         return render.thankyou(id)
    486 <a href="#l468" class="line" id="l468">    468</a> 
    487 <a href="#l469" class="line" id="l469">    469</a> class login:
    488 <a href="#l470" class="line" id="l470">    470</a>     form = web.form.Form(
    489 <a href="#l471" class="line" id="l471">    471</a>     web.form.Textbox(&#39;user&#39;, web.form.notnull, description=&quot;User&quot;),
    490 <a href="#l472" class="line" id="l472">    472</a>     web.form.Password(&#39;password&#39;, web.form.notnull, description=&quot;Passcode&quot;),
    491 <a href="#l473" class="line" id="l473">    473</a>     web.form.Button(&#39;Login&#39;))
    492 <a href="#l474" class="line" id="l474">    474</a>     def GET(self):
    493 <a href="#l475" class="line" id="l475">    475</a>         if not logged():
    494 <a href="#l476" class="line" id="l476">    476</a>             loginform = self.form()
    495 <a href="#l477" class="line" id="l477">    477</a>             return render.login(loginform)
    496 <a href="#l478" class="line" id="l478">    478</a>         else:
    497 <a href="#l479" class="line" id="l479">    479</a>             raise web.seeother(&#39;/op&#39;)
    498 <a href="#l480" class="line" id="l480">    480</a>     def POST(self):
    499 <a href="#l481" class="line" id="l481">    481</a>         loginform = self.form()
    500 <a href="#l482" class="line" id="l482">    482</a>         if not loginform.validates():
    501 <a href="#l483" class="line" id="l483">    483</a>             return render.login(loginform)
    502 <a href="#l484" class="line" id="l484">    484</a>         else:
    503 <a href="#l485" class="line" id="l485">    485</a>             i = web.input()
    504 <a href="#l486" class="line" id="l486">    486</a>             if (i.user,i.password) in allowed:
    505 <a href="#l487" class="line" id="l487">    487</a>                 session.login = 1
    506 <a href="#l488" class="line" id="l488">    488</a>                 raise web.seeother(&#39;/op&#39;)
    507 <a href="#l489" class="line" id="l489">    489</a>             else:
    508 <a href="#l490" class="line" id="l490">    490</a>                 return render.login(loginform)
    509 <a href="#l491" class="line" id="l491">    491</a> 
    510 <a href="#l492" class="line" id="l492">    492</a> class logout:
    511 <a href="#l493" class="line" id="l493">    493</a>     def GET(self):
    512 <a href="#l494" class="line" id="l494">    494</a>         session.login = 0
    513 <a href="#l495" class="line" id="l495">    495</a>         raise web.seeother(&#39;/&#39;)
    514 <a href="#l496" class="line" id="l496">    496</a> 
    515 <a href="#l497" class="line" id="l497">    497</a> class op:
    516 <a href="#l498" class="line" id="l498">    498</a>     def GET(self):
    517 <a href="#l499" class="line" id="l499">    499</a>         if logged():
    518 <a href="#l500" class="line" id="l500">    500</a>             return renderop.operator()
    519 <a href="#l501" class="line" id="l501">    501</a>         else:
    520 <a href="#l502" class="line" id="l502">    502</a>             raise web.seeother(&#39;/login&#39;)
    521 <a href="#l503" class="line" id="l503">    503</a> 
    522 <a href="#l504" class="line" id="l504">    504</a> class categories:
    523 <a href="#l505" class="line" id="l505">    505</a>     form = web.form.Form(
    524 <a href="#l506" class="line" id="l506">    506</a>     web.form.Textbox(&#39;category&#39;, web.form.notnull, description=&quot;Add Category:&quot;),    
    525 <a href="#l507" class="line" id="l507">    507</a>     web.form.Button(&#39;Add&#39;))
    526 <a href="#l508" class="line" id="l508">    508</a>     def GET(self):
    527 <a href="#l509" class="line" id="l509">    509</a>         if logged():
    528 <a href="#l510" class="line" id="l510">    510</a>             i = web.input(delete=None)
    529 <a href="#l511" class="line" id="l511">    511</a>             if i.delete:
    530 <a href="#l512" class="line" id="l512">    512</a>                 db.delete(&#39;categories&#39;, where=&#39;id=&#39;+i.delete)
    531 <a href="#l513" class="line" id="l513">    513</a>             listcategories = db.query(&quot;SELECT * FROM categories ORDER BY id DESC&quot;)
    532 <a href="#l514" class="line" id="l514">    514</a>             addcategory = self.form()
    533 <a href="#l515" class="line" id="l515">    515</a>             return renderop.categories(listcategories,addcategory)
    534 <a href="#l516" class="line" id="l516">    516</a>         else:
    535 <a href="#l517" class="line" id="l517">    517</a>             raise web.seeother(&#39;/login&#39;)
    536 <a href="#l518" class="line" id="l518">    518</a>     def POST(self):
    537 <a href="#l519" class="line" id="l519">    519</a>         addcategory = self.form()
    538 <a href="#l520" class="line" id="l520">    520</a>         i = web.input()
    539 <a href="#l521" class="line" id="l521">    521</a>         db.insert(&#39;categories&#39;, category=i.category)
    540 <a href="#l522" class="line" id="l522">    522</a>         raise web.seeother(&#39;/categories&#39;)
    541 <a href="#l523" class="line" id="l523">    523</a> 
    542 <a href="#l524" class="line" id="l524">    524</a> 
    543 <a href="#l525" class="line" id="l525">    525</a> class products:
    544 <a href="#l526" class="line" id="l526">    526</a>     listcategories = db.query(&quot;SELECT * FROM categories ORDER BY id DESC&quot;)
    545 <a href="#l527" class="line" id="l527">    527</a>     p = []
    546 <a href="#l528" class="line" id="l528">    528</a>     for i in listcategories:
    547 <a href="#l529" class="line" id="l529">    529</a>         p.append(i.category)
    548 <a href="#l530" class="line" id="l530">    530</a>     #p = listcategories[0]
    549 <a href="#l531" class="line" id="l531">    531</a>     form = web.form.Form(
    550 <a href="#l532" class="line" id="l532">    532</a>     web.form.Dropdown(&#39;category&#39;, p, web.form.notnull, description=&quot;Category:&quot;),
    551 <a href="#l533" class="line" id="l533">    533</a>     web.form.Textbox(&#39;name&#39;, web.form.notnull, description=&quot;Name:&quot;),
    552 <a href="#l534" class="line" id="l534">    534</a>     web.form.Textarea(&#39;description&#39;, web.form.notnull, description=&quot;Description:&quot;),
    553 <a href="#l535" class="line" id="l535">    535</a>     web.form.Textbox(&#39;price&#39;, web.form.regexp(&#39;\d+&#39;, &#39;number thanx!&#39;), web.form.notnull, description=&quot;Price in cents&quot;),
    554 <a href="#l536" class="line" id="l536">    536</a>     web.form.Textbox(&#39;available&#39;, web.form.notnull, web.form.regexp(&#39;\d+&#39;, &#39;number dumbass!&#39;), description=&quot;Available&quot;),
    555 <a href="#l537" class="line" id="l537">    537</a>     web.form.Textbox(&#39;priority&#39;, web.form.notnull, web.form.regexp(&#39;\d+&#39;, &#39;number dumbass!&#39;), description=&quot;Priority (high value more priority)&quot;),
    556 <a href="#l538" class="line" id="l538">    538</a>     web.form.Button(&#39;Save&#39;))
    557 <a href="#l539" class="line" id="l539">    539</a>     def GET(self, idvalue):
    558 <a href="#l540" class="line" id="l540">    540</a>         if logged():
    559 <a href="#l541" class="line" id="l541">    541</a>             i = web.input()
    560 <a href="#l542" class="line" id="l542">    542</a>             if i:
    561 <a href="#l543" class="line" id="l543">    543</a>                 if i.cmd == &#39;del&#39;:
    562 <a href="#l544" class="line" id="l544">    544</a>                     db.delete(&#39;products&#39;, where=&#39;id=&#39; + idvalue)
    563 <a href="#l545" class="line" id="l545">    545</a>                     imgdir = staticdir + &#39;img/&#39; + idvalue
    564 <a href="#l546" class="line" id="l546">    546</a>                     try:
    565 <a href="#l547" class="line" id="l547">    547</a>                         shutil.rmtree(imgdir,ignore_errors=True,onerror=None)
    566 <a href="#l548" class="line" id="l548">    548</a>                     except:
    567 <a href="#l549" class="line" id="l549">    549</a>                         print(&#39;no picture folder, nothing to remove...&#39;)
    568 <a href="#l550" class="line" id="l550">    550</a>                         pass
    569 <a href="#l551" class="line" id="l551">    551</a>                     raise web.seeother(&#39;/products/&#39;)
    570 <a href="#l552" class="line" id="l552">    552</a>                 if i.cmd == &#39;removeimg&#39;:
    571 <a href="#l553" class="line" id="l553">    553</a>                     os.remove(staticdir + &#39;/img/&#39; + idvalue + &#39;/&#39; + i.img)
    572 <a href="#l554" class="line" id="l554">    554</a>                     os.remove(staticdir + &#39;/img/&#39; + idvalue + &#39;/web/&#39; + i.img)
    573 <a href="#l555" class="line" id="l555">    555</a>                     os.remove(staticdir + &#39;/img/&#39; + idvalue + &#39;/thumb/&#39; + i.img)
    574 <a href="#l556" class="line" id="l556">    556</a>                     raise web.seeother(&#39;/products/&#39; + idvalue)
    575 <a href="#l557" class="line" id="l557">    557</a>                     organizepics(idvalue)
    576 <a href="#l558" class="line" id="l558">    558</a>             addproduct = self.form()
    577 <a href="#l559" class="line" id="l559">    559</a>             addproduct.fill(available=&#39;1&#39;, priority=&#39;1&#39;)
    578 <a href="#l560" class="line" id="l560">    560</a>             if idvalue:
    579 <a href="#l561" class="line" id="l561">    561</a>                 oldinfo = db.select(&#39;products&#39;, where=&quot;id=&quot; + idvalue, what=&#39;name, description, price, available, priority, category&#39;)
    580 <a href="#l562" class="line" id="l562">    562</a>                 oldinfo = oldinfo[0]
    581 <a href="#l563" class="line" id="l563">    563</a>                 addproduct.fill(name=oldinfo.name, description=oldinfo.description, price=oldinfo.price, available=oldinfo.available, priority=oldinfo.priority, category=oldinfo.category)
    582 <a href="#l564" class="line" id="l564">    564</a>             listproducts = db.query(&quot;SELECT * FROM products ORDER BY priority DESC&quot;)
    583 <a href="#l565" class="line" id="l565">    565</a>             imgdir = staticdir + &#39;img/&#39; + idvalue + &#39;/web/&#39;
    584 <a href="#l566" class="line" id="l566">    566</a>             try:
    585 <a href="#l567" class="line" id="l567">    567</a>                 productimages = sorted(os.listdir(imgdir))
    586 <a href="#l568" class="line" id="l568">    568</a>                 print(productimages)
    587 <a href="#l569" class="line" id="l569">    569</a>             except:
    588 <a href="#l570" class="line" id="l570">    570</a>                 productimages = []
    589 <a href="#l571" class="line" id="l571">    571</a>                 print(&#39;No productimages for this product&#39;)
    590 <a href="#l572" class="line" id="l572">    572</a>             return renderop.products(addproduct, listproducts, productimages, idvalue)
    591 <a href="#l573" class="line" id="l573">    573</a>         else:
    592 <a href="#l574" class="line" id="l574">    574</a>             raise web.seeother(&#39;/login&#39;) 
    593 <a href="#l575" class="line" id="l575">    575</a>     def POST(self, idvalue):
    594 <a href="#l576" class="line" id="l576">    576</a>         listproducts = db.query(&quot;SELECT * FROM products ORDER BY priority DESC&quot;)
    595 <a href="#l577" class="line" id="l577">    577</a>         addproduct = self.form()
    596 <a href="#l578" class="line" id="l578">    578</a>         if logged():
    597 <a href="#l579" class="line" id="l579">    579</a>             i = web.input(imgfile={})
    598 <a href="#l580" class="line" id="l580">    580</a>             for p in i:
    599 <a href="#l581" class="line" id="l581">    581</a>                 print(p)
    600 <a href="#l582" class="line" id="l582">    582</a>             if i.imgfile != {}:
    601 <a href="#l583" class="line" id="l583">    583</a>                 if idvalue == &#39;&#39;:
    602 <a href="#l584" class="line" id="l584">    584</a>                     print(&#39;cant upload a picture to a non existing product&#39;)
    603 <a href="#l585" class="line" id="l585">    585</a>                     raise web.seeother(&#39;/products/&#39;)
    604 <a href="#l586" class="line" id="l586">    586</a>                 print(i.imgfile.filename)
    605 <a href="#l587" class="line" id="l587">    587</a>                 if i.imgfile.filename == &#39;&#39;:
    606 <a href="#l588" class="line" id="l588">    588</a>                     print(&#39;hmmm... no image to upload&#39;)
    607 <a href="#l589" class="line" id="l589">    589</a>                     raise web.seeother(&#39;/products/&#39; + idvalue)
    608 <a href="#l590" class="line" id="l590">    590</a>                 print(&#39;YEAH, Upload image!&#39;)
    609 <a href="#l591" class="line" id="l591">    591</a> 
    610 <a href="#l592" class="line" id="l592">    592</a>                 ##---------- UPLOAD IMAGE ----------
    611 <a href="#l593" class="line" id="l593">    593</a> 
    612 <a href="#l594" class="line" id="l594">    594</a>                 imgdir = staticdir + &#39;img/&#39; + idvalue
    613 <a href="#l595" class="line" id="l595">    595</a>                 os.makedirs(imgdir, exist_ok=True)
    614 <a href="#l596" class="line" id="l596">    596</a>                 imgpath=i.imgfile.filename.replace(&#39;\\&#39;,&#39;/&#39;) # replaces the windows-style slashes with linux ones.
    615 <a href="#l597" class="line" id="l597">    597</a>                 #filename=filepath.split(&#39;/&#39;)[-1] # splits the and chooses the last part (the filename with extension)
    616 <a href="#l598" class="line" id="l598">    598</a>                 #filename = hashlib.md5(str(random.getrandbits(256)).encode(&#39;utf-8&#39;)).hexdigest() + &#39;.jpeg&#39;
    617 <a href="#l599" class="line" id="l599">    599</a>                 imgname = str(len(os.listdir(imgdir))).zfill(3) + &#39;.jpeg&#39;
    618 <a href="#l600" class="line" id="l600">    600</a>                 fout = open(imgdir +&#39;/&#39;+ imgname,&#39;wb&#39;) # creates the file where the uploaded file should be stored
    619 <a href="#l601" class="line" id="l601">    601</a>                 fout.write(i.imgfile.file.read()) # writes the uploaded file to the newly created file.
    620 <a href="#l602" class="line" id="l602">    602</a>                 fout.close() # closes the file, upload complete.
    621 <a href="#l603" class="line" id="l603">    603</a> 
    622 <a href="#l604" class="line" id="l604">    604</a>                 ##---------- OPEN FILE &amp; CHEKC IF JPEG --------
    623 <a href="#l605" class="line" id="l605">    605</a> 
    624 <a href="#l606" class="line" id="l606">    606</a>                 image = Image.open(imgdir +&#39;/&#39;+ imgname)
    625 <a href="#l607" class="line" id="l607">    607</a>                 if image.format != &#39;JPEG&#39;:
    626 <a href="#l608" class="line" id="l608">    608</a>                     os.remove(imgdir +&#39;/&#39;+ imgname)
    627 <a href="#l609" class="line" id="l609">    609</a>                     raise web.seeother(&#39;/products/&#39; + idvalue)
    628 <a href="#l610" class="line" id="l610">    610</a> 
    629 <a href="#l611" class="line" id="l611">    611</a>                 ##---------- RESIZE IMAGE -----------
    630 <a href="#l612" class="line" id="l612">    612</a>                 try:
    631 <a href="#l613" class="line" id="l613">    613</a>                     os.makedirs(imgdir + &#39;/web/&#39;, exist_ok=True)
    632 <a href="#l614" class="line" id="l614">    614</a>                     os.makedirs(imgdir + &#39;/thumb/&#39;, exist_ok=True)
    633 <a href="#l615" class="line" id="l615">    615</a>                 except:
    634 <a href="#l616" class="line" id="l616">    616</a>                     print(&#39;Folders is&#39;)
    635 <a href="#l617" class="line" id="l617">    617</a>                 image.thumbnail((900,900), Image.ANTIALIAS)
    636 <a href="#l618" class="line" id="l618">    618</a>                 image.save(imgdir + &#39;/web/&#39; + imgname)
    637 <a href="#l619" class="line" id="l619">    619</a>                 image.thumbnail((300,300), Image.ANTIALIAS)
    638 <a href="#l620" class="line" id="l620">    620</a>                 image.save(imgdir + &#39;/thumb/&#39; + imgname)
    639 <a href="#l621" class="line" id="l621">    621</a> 
    640 <a href="#l622" class="line" id="l622">    622</a>                 organizepics(idvalue)
    641 <a href="#l623" class="line" id="l623">    623</a>                 raise web.seeother(&#39;/products/&#39; + idvalue)
    642 <a href="#l624" class="line" id="l624">    624</a>             if not addproduct.validates():
    643 <a href="#l625" class="line" id="l625">    625</a>                 raise web.seeother(&#39;/products/&#39; + idvalue)
    644 <a href="#l626" class="line" id="l626">    626</a>             else:
    645 <a href="#l627" class="line" id="l627">    627</a>                 if idvalue:
    646 <a href="#l628" class="line" id="l628">    628</a>                     db.update(&#39;products&#39;, where=&#39;id=&#39; + idvalue, category=i.category,  name=i.name, description=i.description, price=i.price, available=i.available, sold=0, priority=i.priority, dateadded=datetime.datetime.now())
    647 <a href="#l629" class="line" id="l629">    629</a>                 else:
    648 <a href="#l630" class="line" id="l630">    630</a>                     db.insert(&#39;products&#39;, category=i.category, name=i.name, description=i.description, price=i.price, available=i.available, sold=0, priority=i.priority, dateadded=datetime.datetime.now())
    649 <a href="#l631" class="line" id="l631">    631</a>                 raise web.seeother(&#39;/products/&#39; + idvalue)
    650 <a href="#l632" class="line" id="l632">    632</a>         else:
    651 <a href="#l633" class="line" id="l633">    633</a>             raise web.seeother(&#39;/login&#39;)
    652 <a href="#l634" class="line" id="l634">    634</a> 
    653 <a href="#l635" class="line" id="l635">    635</a> class shipping:
    654 <a href="#l636" class="line" id="l636">    636</a>     form = web.form.Form(
    655 <a href="#l637" class="line" id="l637">    637</a>     web.form.Textbox(&#39;country&#39;, web.form.notnull, description=&quot;Country:&quot;),
    656 <a href="#l638" class="line" id="l638">    638</a>     web.form.Textbox(&#39;price&#39;, web.form.regexp(&#39;\d+&#39;, &#39;number thanx!&#39;), web.form.notnull, description=&quot;Price in cents&quot;),
    657 <a href="#l639" class="line" id="l639">    639</a>     web.form.Textbox(&#39;days&#39;, web.form.regexp(&#39;\d+&#39;, &#39;number thanx!&#39;), web.form.notnull, description=&quot;Shipping in days&quot;),
    658 <a href="#l640" class="line" id="l640">    640</a>     web.form.Button(&#39;Add shipping country&#39;))
    659 <a href="#l641" class="line" id="l641">    641</a>     def GET(self, idvalue):
    660 <a href="#l642" class="line" id="l642">    642</a>         if logged():
    661 <a href="#l643" class="line" id="l643">    643</a>             addcountry = self.form()
    662 <a href="#l644" class="line" id="l644">    644</a>             if idvalue:
    663 <a href="#l645" class="line" id="l645">    645</a>                 oldinfo = db.select(&#39;shipping&#39;, where=&quot;id=&quot; + idvalue, what=&#39;country, price, days&#39;)
    664 <a href="#l646" class="line" id="l646">    646</a>                 oldinfo = oldinfo[0]
    665 <a href="#l647" class="line" id="l647">    647</a>                 addcountry.fill(country=oldinfo.country, price=oldinfo.price, days=oldinfo.days)
    666 <a href="#l648" class="line" id="l648">    648</a>             listcountries = db.query(&quot;SELECT * FROM shipping ORDER BY country DESC&quot;)
    667 <a href="#l649" class="line" id="l649">    649</a>             return renderop.shipping(addcountry, listcountries)
    668 <a href="#l650" class="line" id="l650">    650</a>         else:
    669 <a href="#l651" class="line" id="l651">    651</a>             raise web.seeother(&#39;/login&#39;)
    670 <a href="#l652" class="line" id="l652">    652</a>     def POST(self, idvalue):
    671 <a href="#l653" class="line" id="l653">    653</a>         if logged():
    672 <a href="#l654" class="line" id="l654">    654</a>             addcountry = self.form()
    673 <a href="#l655" class="line" id="l655">    655</a>             if not addcountry.validates():
    674 <a href="#l656" class="line" id="l656">    656</a>                 listcountries = db.query(&quot;SELECT * FROM shipping ORDER BY country DESC&quot;)
    675 <a href="#l657" class="line" id="l657">    657</a>                 return renderop.shipping(addcountry, listcountries)
    676 <a href="#l658" class="line" id="l658">    658</a>             else:
    677 <a href="#l659" class="line" id="l659">    659</a>                 i = web.input()
    678 <a href="#l660" class="line" id="l660">    660</a>                 if idvalue:
    679 <a href="#l661" class="line" id="l661">    661</a>                     db.update(&#39;shipping&#39;, where=&#39;id=&#39; + idvalue, country=i.country, price=i.price, days=i.days)
    680 <a href="#l662" class="line" id="l662">    662</a>                 else:
    681 <a href="#l663" class="line" id="l663">    663</a>                     db.insert(&#39;shipping&#39;, country=i.country, price=i.price, days=i.days)
    682 <a href="#l664" class="line" id="l664">    664</a>                 raise web.seeother(&#39;/shipping/&#39;)
    683 <a href="#l665" class="line" id="l665">    665</a>         else:
    684 <a href="#l666" class="line" id="l666">    666</a>             raise web.seeother(&#39;/login&#39;)
    685 <a href="#l667" class="line" id="l667">    667</a> 
    686 <a href="#l668" class="line" id="l668">    668</a> class bitcoin:
    687 <a href="#l669" class="line" id="l669">    669</a>     def GET(self):
    688 <a href="#l670" class="line" id="l670">    670</a>         if logged():
    689 <a href="#l671" class="line" id="l671">    671</a>             bitcoinrpc = AuthServiceProxy(rpcauth)
    690 <a href="#l672" class="line" id="l672">    672</a>             wallet = bitcoinrpc.getwalletinfo()
    691 <a href="#l673" class="line" id="l673">    673</a>             bitcoinrpc = None
    692 <a href="#l674" class="line" id="l674">    674</a>             return renderop.bitcoin(wallet)
    693 <a href="#l675" class="line" id="l675">    675</a> 
    694 <a href="#l676" class="line" id="l676">    676</a> application = app.wsgifunc()
    695 </pre>
    696 </div>
    697 </body>
    698 </html>