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 'description' 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 'description' 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> '/?', 'index', 42 <a href="#l24" class="line" id="l24"> 24</a> '/putinbag/(.*)', 'putinbag', 43 <a href="#l25" class="line" id="l25"> 25</a> '/dropitem/(.*)?', 'dropitem', 44 <a href="#l26" class="line" id="l26"> 26</a> '/payln/(.*)', 'payln', 45 <a href="#l27" class="line" id="l27"> 27</a> '/paybtc/(.*)', 'paybtc', 46 <a href="#l28" class="line" id="l28"> 28</a> '/payment/(.*)', 'payment', 47 <a href="#l29" class="line" id="l29"> 29</a> '/checkout', 'checkout', 48 <a href="#l30" class="line" id="l30"> 30</a> '/pending', 'pending', 49 <a href="#l31" class="line" id="l31"> 31</a> '/thankyou', 'thankyou', 50 <a href="#l32" class="line" id="l32"> 32</a> '/login', 'login', 51 <a href="#l33" class="line" id="l33"> 33</a> '/logout', 'logout', 52 <a href="#l34" class="line" id="l34"> 34</a> '/products/(.*)?', 'products', 53 <a href="#l35" class="line" id="l35"> 35</a> '/bigpic/(.*)?', 'bigpic', 54 <a href="#l36" class="line" id="l36"> 36</a> '/categories?', 'categories', 55 <a href="#l37" class="line" id="l37"> 37</a> '/op', 'op', 56 <a href="#l38" class="line" id="l38"> 38</a> '/bitcoin', 'bitcoin', 57 <a href="#l39" class="line" id="l39"> 39</a> '/shipping/(.*)', 'shipping', 58 <a href="#l40" class="line" id="l40"> 40</a> '/payments?', 'payments') 59 <a href="#l41" class="line" id="l41"> 41</a> 60 <a href="#l42" class="line" id="l42"> 42</a> allowed = (("rbckman", "secret"), 61 <a href="#l43" class="line" id="l43"> 43</a> ("brkhelle", "topsecret")) 62 <a href="#l44" class="line" id="l44"> 44</a> 63 <a href="#l45" class="line" id="l45"> 45</a> productsbad = (("GetDaFuckOuttaHere", 420.00), 64 <a href="#l46" class="line" id="l46"> 46</a> ("GetDaFuckOuttaHere Viewfinder", 80.00), 65 <a href="#l47" class="line" id="l47"> 47</a> ("Picamera", 30.00), 66 <a href="#l48" class="line" id="l48"> 48</a> ("Donation", 0.005)) 67 <a href="#l49" class="line" id="l49"> 49</a> 68 <a href="#l50" class="line" id="l50"> 50</a> bag = '' 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 + '/public_html/templates/' 80 <a href="#l62" class="line" id="l62"> 62</a> staticdir = basedir + '/public_html/static/' 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 + '/sessions') 84 <a href="#l66" class="line" id="l66"> 66</a> render = web.template.render(templatedir, base="base") 85 <a href="#l67" class="line" id="l67"> 67</a> renderop = web.template.render(templatedir, base="op") 86 <a href="#l68" class="line" id="l68"> 68</a> db = web.database(dbn='sqlite', db=basedir + "/db/cyberpunkcafe.db") 87 <a href="#l69" class="line" id="l69"> 69</a> session = web.session.Session(app,store,initializer={'login':0, 'privilege':0, 'bag':[], 'sessionkey':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(('echo', msg), stdout=subprocess.PIPE) 112 <a href="#l94" class="line" id="l94"> 94</a> sendmsg = subprocess.check_output(('mail', '-r', 'rob@tarina.org', '-s', 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(['echo', msg, '|', 'mail', '-r', 'rob@tarina.org','-s', 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 = {"msatoshi":amount, "description": "{}".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+'/invoice/', 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+'/invoice/'+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('products', where="id='"+str(i.id)+"'", available=i.available+1) 136 <a href="#l118" class="line" id="l118"> 118</a> product = db.query("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"' AND product='"+str(i.id)+"';")[0] 137 <a href="#l119" class="line" id="l119"> 119</a> if product.quantity > 1: 138 <a href="#l120" class="line" id="l120"> 120</a> db.update('customerbag', where="sessionkey='" + session.sessionkey +"' and product='"+str(i.id)+"'", 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("DELETE FROM customerbag WHERE sessionkey='" + session.sessionkey +"' AND product='"+str(i.id)+"';") 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 > 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('products', where="id='"+str(i.id)+"'", available=i.available-1) 147 <a href="#l129" class="line" id="l129"> 129</a> product = db.query("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"' AND product='"+str(i.id)+"';") 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('customerbag', where="sessionkey='" + session.sessionkey +"' and product='"+str(i.id)+"'", quantity=product.quantity+1) 152 <a href="#l134" class="line" id="l134"> 134</a> print('gwtdafaakouttahere') 153 <a href="#l135" class="line" id="l135"> 135</a> else: 154 <a href="#l136" class="line" id="l136"> 136</a> db.insert('customerbag', 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("SELECT name FROM products WHERE id='"+str(productid)+"';")[0] 159 <a href="#l141" class="line" id="l141"> 141</a> except: 160 <a href="#l142" class="line" id="l142"> 142</a> return '' 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("SELECT * FROM products WHERE id='"+str(productid)+"';")[0] 166 <a href="#l148" class="line" id="l148"> 148</a> except: 167 <a href="#l149" class="line" id="l149"> 149</a> return '' 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("SELECT available FROM products WHERE id='"+str(productid)+"';")[0] 173 <a href="#l155" class="line" id="l155"> 155</a> except: 174 <a href="#l156" class="line" id="l156"> 156</a> return '' 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('checking for old bags') 179 <a href="#l161" class="line" id="l161"> 161</a> bags = db.select('customerbag') 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 > 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("Fuck") 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('found a bag at door! goddamit, got to put ' + str(bag.quantity) + ' x ' + product.name + ' back on the shelf') 187 <a href="#l169" class="line" id="l169"> 169</a> if product.available > 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('products', where="id='"+str(bag.product)+"'", available=str(q)) 192 <a href="#l174" class="line" id="l174"> 174</a> db.query("DELETE FROM customerbag WHERE sessionkey='" + bag.sessionkey + "'") 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('check items from availability') 196 <a href="#l178" class="line" id="l178"> 178</a> bag = db.query("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey + "'") 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 < 0: 201 <a href="#l183" class="line" id="l183"> 183</a> web.seeother('/?error=soldout') 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('remove items from availability') 207 <a href="#l189" class="line" id="l189"> 189</a> bag = db.query("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey + "'") 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 < 0: 212 <a href="#l194" class="line" id="l194"> 194</a> web.seeother('/?error=soldout') 213 <a href="#l195" class="line" id="l195"> 195</a> else: 214 <a href="#l196" class="line" id="l196"> 196</a> db.update('products', where="id='"+str(i.product)+"'", 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+'/public_html/static/img/' + str(product) + '/' 219 <a href="#l201" class="line" id="l201"> 201</a> imgdirlist = [imgdir, imgdir + 'web/', imgdir + 'thumb/'] 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 '.jpeg' 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('correcto pic numbering') 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('false, correcting pic from ' + str(unorganized_nr) + ' to ' + str(organized_nr)) 232 <a href="#l214" class="line" id="l214"> 214</a> mv = 'mv ' + d + str(unorganized_nr).zfill(3) + '.jpeg' 233 <a href="#l215" class="line" id="l215"> 215</a> mv2 = ' ' + d + str(organized_nr).zfill(3) + '.jpeg' 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('pending', where="invoice_key='" + session.sessionkey + "'", what='country, firstname, lastname, address, town, postalcode, email')[0] 240 <a href="#l222" class="line" id="l222"> 222</a> except: 241 <a href="#l223" class="line" id="l223"> 223</a> pendinginfo = '' 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('utf-8')).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('/#' + i.putinbag) 256 <a href="#l238" class="line" id="l238"> 238</a> print('Cyberpunk cafe') 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("SELECT * FROM products ORDER BY priority DESC") 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 = [''] 265 <a href="#l247" class="line" id="l247"> 247</a> imgdir = staticdir + 'img/' + str(i.id) + '/web/' 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 = [''] 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('No product images') 273 <a href="#l255" class="line" id="l255"> 255</a> pass 274 <a href="#l256" class="line" id="l256"> 256</a> i.update({'images':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("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"';") 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('/') 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('/#'+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('faaaakyeee ' + 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('shipping', what='country', order='country ASC') 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('NO-SHIPPING') 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 != 'NO-SHIPPING': 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('country', t, web.form.notnull, description="Country"), 311 <a href="#l293" class="line" id="l293"> 293</a> web.form.Textbox('firstname', web.form.notnull, description="First Name:"), 312 <a href="#l294" class="line" id="l294"> 294</a> web.form.Textbox('lastname', web.form.notnull, description="Last Name:"), 313 <a href="#l295" class="line" id="l295"> 295</a> web.form.Textbox('address', web.form.notnull, description="Shipping Address:"), 314 <a href="#l296" class="line" id="l296"> 296</a> web.form.Textbox('town', web.form.notnull, description="Town / City:"), 315 <a href="#l297" class="line" id="l297"> 297</a> web.form.Textbox('postalcode', web.form.regexp('\d+', 'number thanx!'), web.form.notnull, description="Postalcode / zip"), 316 <a href="#l298" class="line" id="l298"> 298</a> web.form.Textbox('email', web.form.notnull, description="Email:"), 317 <a href="#l299" class="line" id="l299"> 299</a> web.form.Button('Calculate shipping cost')) 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("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"';") 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 != 'NO-SHIPPING': 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('pending', where="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()) 338 <a href="#l320" class="line" id="l320"> 320</a> else: 339 <a href="#l321" class="line" id="l321"> 321</a> db.insert('pending', 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('/pending') 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('payment', ['Bitcoin Lightning', 'Bitcoin'], web.form.notnull, description="Select payment method"), 345 <a href="#l327" class="line" id="l327"> 327</a> web.form.Button('Pay')) 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('shipping', where="country='" + pendinginfo.country + "'", what='price, days')[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("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"';") 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('shipping', where="country='" + pendinginfo.country + "'", what='price, days')[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 = '' 364 <a href="#l346" class="line" id="l346"> 346</a> bag = db.query("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"';") 365 <a href="#l347" class="line" id="l347"> 347</a> comma = '' 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) + ' x ' + productname(s.product) 369 <a href="#l351" class="line" id="l351"> 351</a> comma = ', ' 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), 'EUR') * 100000000) 373 <a href="#l355" class="line" id="l355"> 355</a> totbtc = int(b.convert_to_btc(float(totalamount/100), 'EUR')) 374 <a href="#l356" class="line" id="l356"> 356</a> print(str(totalamount) + ' | ' + description) 375 <a href="#l357" class="line" id="l357"> 357</a> print(str(totsats) + ' | ' + description) 376 <a href="#l358" class="line" id="l358"> 358</a> #else: 377 <a href="#l359" class="line" id="l359"> 359</a> # web.seeother('/') 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('qrencode -s 5 -o '+ staticdir + 'qr/' + invoice['id']+'.png ' + invoice['payreq']) 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('GetDaFuckOuttaHere Butik') 384 <a href="#l366" class="line" id="l366"> 366</a> bitcoinrpc = None 385 <a href="#l367" class="line" id="l367"> 367</a> btcuri = 'bitcoin:' + newaddress + '?amount=' + str(totbtc) + '&label=' + description 386 <a href="#l368" class="line" id="l368"> 368</a> callsubprocess('qrencode -s 5 -o '+ staticdir + 'qr/' + newaddress +'.png ' + btcuri) 387 <a href="#l369" class="line" id="l369"> 369</a> try: 388 <a href="#l370" class="line" id="l370"> 370</a> db.query("DELETE FROM invoices WHERE invoice_key='" + session.sessionkey +"';") 389 <a href="#l371" class="line" id="l371"> 371</a> except: 390 <a href="#l372" class="line" id="l372"> 372</a> print('no old invoices to delete') 391 <a href="#l373" class="line" id="l373"> 373</a> db.insert('invoices', invoice_key=session.sessionkey, btc=newaddress, ln=invoice['id'], products=description, payment=i.payment, amount=totalamount, totsats=totsats, timestamp=time.strftime('%Y-%m-%d %H:%M:%S')) 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 = 'You got a new order, from ' + pendinginfo.firstname + ' ' + pendinginfo.lastname + ' from ' + pendinginfo.country + ' email: ' + pendinginfo.email + ' this dude wantz ' + description + ' for ' + str(int(totalamount/100)) + '€ ' + ' with ' + i.payment 394 <a href="#l376" class="line" id="l376"> 376</a> sendmail(webmaster, 'GetDaFuckOuttaHere Shop', 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 == 'Bitcoin': 397 <a href="#l379" class="line" id="l379"> 379</a> paymentlink = 'paybtc/' 398 <a href="#l380" class="line" id="l380"> 380</a> if i.payment == 'Bitcoin Lightning': 399 <a href="#l381" class="line" id="l381"> 381</a> paymentlink = 'payln/' 400 <a href="#l382" class="line" id="l382"> 382</a> if pendinginfo.email != '': 401 <a href="#l383" class="line" id="l383"> 383</a> msg = "Thank you for ordering " + description + " at GetDaFuckOuttaHere Shop, we'll be processing your order as soon as possible and send it to " + pendinginfo.firstname + ' ' + pendinginfo.lastname + ', ' + pendinginfo.address + ', ' + str(pendinginfo.postalcode) + ', ' + pendinginfo.town + ', ' + pendinginfo.country + '. To pay/view status of your order please visit ' + baseurl + paymentlink + session.sessionkey 402 <a href="#l384" class="line" id="l384"> 384</a> sendmail(pendinginfo.email, 'GetDaFuckOuttaHere Shop', msg) 403 <a href="#l385" class="line" id="l385"> 385</a> if i.payment == 'Bitcoin': 404 <a href="#l386" class="line" id="l386"> 386</a> return web.seeother('/paybtc/' + session.sessionkey) 405 <a href="#l387" class="line" id="l387"> 387</a> if i.payment == 'Bitcoin Lightning': 406 <a href="#l388" class="line" id="l388"> 388</a> return web.seeother('/payln/' + 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('/') 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('invoices', where="invoice_key='" + invoice_key + "'", what='invoice_key, btc, ln, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped')[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("SELECT * FROM customerbag WHERE sessionkey='" + session.sessionkey +"';") 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('/?error=timeout') 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('utf8').replace("'", '"') 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['status'] == 'paid': 426 <a href="#l408" class="line" id="l408"> 408</a> print("Hurray it worked") 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('invoices', where="invoice_key='" + invoice_key + "'", what='invoice_key, btc, ln, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped')[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 = 'bitcoin:' + btcaddress + '?amount=' + str(totbtc) + '&label=' + 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['confirmations']) 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 > 6: 444 <a href="#l426" class="line" id="l426"> 426</a> msg = 'GetDaFuckOuttaHere order update! someone sent you Bitcoin! ' + baseurl + '/paybtc/' + 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, 'GetDaFuckOuttaHere Shop', msg) 447 <a href="#l429" class="line" id="l429"> 429</a> db.update('invoices', where="invoice_key='" + invoice.invoice_key + "'", status='paid', datepaid=time.strftime('%Y-%m-%d %H:%M:%S')) 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('invoices', where="invoice_key='" + w.key + "'", 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('pending', where="invoice_key='" + w.key + "'", what='country, firstname, lastname, address, town, postalcode, email')[0] 457 <a href="#l439" class="line" id="l439"> 439</a> payment = db.select('invoices', where="invoice_key='" + w.key + "'", what='btc, ln, invoice_key, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped')[0] 458 <a href="#l440" class="line" id="l440"> 440</a> if payment.payment == 'Bitcoin': 459 <a href="#l441" class="line" id="l441"> 441</a> paylink = 'paybtc/' 460 <a href="#l442" class="line" id="l442"> 442</a> elif payment.payment == 'Bitcoin Lightning': 461 <a href="#l443" class="line" id="l443"> 443</a> paylink = 'payln/' 462 <a href="#l444" class="line" id="l444"> 444</a> if w.status == 'thankyou': 463 <a href="#l445" class="line" id="l445"> 445</a> msg="Hi " + customer.firstname + " " + customer.lastname + ", thank you for ordering. You can track the status of your order at " + baseurl + paylink + payment.invoice_key 464 <a href="#l446" class="line" id="l446"> 446</a> sendmail(customer.email, 'GetDaFuckOuttaHere Shop, a thank you!', msg) 465 <a href="#l447" class="line" id="l447"> 447</a> elif w.status == 'shipped': 466 <a href="#l448" class="line" id="l448"> 448</a> msg="Hi " + customer.firstname + " " + customer.lastname + ", your order has been shipped!. You can track the status of your order at " + baseurl + paylink + payment.invoice_key 467 <a href="#l449" class="line" id="l449"> 449</a> sendmail(customer.email, 'GetDaFuckOuttaHere Shop, order shipped!', 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('invoices', what='btc, ln, invoice_key, products, payment, amount, totsats, timestamp, status, datepaid, dateshipped', order='timestamp DESC') 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('pending', where="invoice_key='" + i.invoice_key + "'", what='country, firstname, lastname, address, town, postalcode, email') 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('invoices', invoice_key=invoice_key)[0]['ln'] 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('user', web.form.notnull, description="User"), 490 <a href="#l472" class="line" id="l472"> 472</a> web.form.Password('password', web.form.notnull, description="Passcode"), 491 <a href="#l473" class="line" id="l473"> 473</a> web.form.Button('Login')) 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('/op') 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('/op') 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('/') 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('/login') 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('category', web.form.notnull, description="Add Category:"), 525 <a href="#l507" class="line" id="l507"> 507</a> web.form.Button('Add')) 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('categories', where='id='+i.delete) 531 <a href="#l513" class="line" id="l513"> 513</a> listcategories = db.query("SELECT * FROM categories ORDER BY id DESC") 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('/login') 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('categories', category=i.category) 540 <a href="#l522" class="line" id="l522"> 522</a> raise web.seeother('/categories') 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("SELECT * FROM categories ORDER BY id DESC") 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('category', p, web.form.notnull, description="Category:"), 551 <a href="#l533" class="line" id="l533"> 533</a> web.form.Textbox('name', web.form.notnull, description="Name:"), 552 <a href="#l534" class="line" id="l534"> 534</a> web.form.Textarea('description', web.form.notnull, description="Description:"), 553 <a href="#l535" class="line" id="l535"> 535</a> web.form.Textbox('price', web.form.regexp('\d+', 'number thanx!'), web.form.notnull, description="Price in cents"), 554 <a href="#l536" class="line" id="l536"> 536</a> web.form.Textbox('available', web.form.notnull, web.form.regexp('\d+', 'number dumbass!'), description="Available"), 555 <a href="#l537" class="line" id="l537"> 537</a> web.form.Textbox('priority', web.form.notnull, web.form.regexp('\d+', 'number dumbass!'), description="Priority (high value more priority)"), 556 <a href="#l538" class="line" id="l538"> 538</a> web.form.Button('Save')) 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 == 'del': 562 <a href="#l544" class="line" id="l544"> 544</a> db.delete('products', where='id=' + idvalue) 563 <a href="#l545" class="line" id="l545"> 545</a> imgdir = staticdir + 'img/' + 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('no picture folder, nothing to remove...') 568 <a href="#l550" class="line" id="l550"> 550</a> pass 569 <a href="#l551" class="line" id="l551"> 551</a> raise web.seeother('/products/') 570 <a href="#l552" class="line" id="l552"> 552</a> if i.cmd == 'removeimg': 571 <a href="#l553" class="line" id="l553"> 553</a> os.remove(staticdir + '/img/' + idvalue + '/' + i.img) 572 <a href="#l554" class="line" id="l554"> 554</a> os.remove(staticdir + '/img/' + idvalue + '/web/' + i.img) 573 <a href="#l555" class="line" id="l555"> 555</a> os.remove(staticdir + '/img/' + idvalue + '/thumb/' + i.img) 574 <a href="#l556" class="line" id="l556"> 556</a> raise web.seeother('/products/' + 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='1', priority='1') 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('products', where="id=" + idvalue, what='name, description, price, available, priority, category') 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("SELECT * FROM products ORDER BY priority DESC") 583 <a href="#l565" class="line" id="l565"> 565</a> imgdir = staticdir + 'img/' + idvalue + '/web/' 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('No productimages for this product') 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('/login') 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("SELECT * FROM products ORDER BY priority DESC") 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 == '': 602 <a href="#l584" class="line" id="l584"> 584</a> print('cant upload a picture to a non existing product') 603 <a href="#l585" class="line" id="l585"> 585</a> raise web.seeother('/products/') 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 == '': 606 <a href="#l588" class="line" id="l588"> 588</a> print('hmmm... no image to upload') 607 <a href="#l589" class="line" id="l589"> 589</a> raise web.seeother('/products/' + idvalue) 608 <a href="#l590" class="line" id="l590"> 590</a> print('YEAH, Upload image!') 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 + 'img/' + 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('\\','/') # replaces the windows-style slashes with linux ones. 615 <a href="#l597" class="line" id="l597"> 597</a> #filename=filepath.split('/')[-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('utf-8')).hexdigest() + '.jpeg' 617 <a href="#l599" class="line" id="l599"> 599</a> imgname = str(len(os.listdir(imgdir))).zfill(3) + '.jpeg' 618 <a href="#l600" class="line" id="l600"> 600</a> fout = open(imgdir +'/'+ imgname,'wb') # 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 & 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 +'/'+ imgname) 625 <a href="#l607" class="line" id="l607"> 607</a> if image.format != 'JPEG': 626 <a href="#l608" class="line" id="l608"> 608</a> os.remove(imgdir +'/'+ imgname) 627 <a href="#l609" class="line" id="l609"> 609</a> raise web.seeother('/products/' + 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 + '/web/', exist_ok=True) 632 <a href="#l614" class="line" id="l614"> 614</a> os.makedirs(imgdir + '/thumb/', 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('Folders is') 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 + '/web/' + 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 + '/thumb/' + 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('/products/' + 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('/products/' + 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('products', where='id=' + 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('products', 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('/products/' + 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('/login') 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('country', web.form.notnull, description="Country:"), 656 <a href="#l638" class="line" id="l638"> 638</a> web.form.Textbox('price', web.form.regexp('\d+', 'number thanx!'), web.form.notnull, description="Price in cents"), 657 <a href="#l639" class="line" id="l639"> 639</a> web.form.Textbox('days', web.form.regexp('\d+', 'number thanx!'), web.form.notnull, description="Shipping in days"), 658 <a href="#l640" class="line" id="l640"> 640</a> web.form.Button('Add shipping country')) 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('shipping', where="id=" + idvalue, what='country, price, days') 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("SELECT * FROM shipping ORDER BY country DESC") 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('/login') 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("SELECT * FROM shipping ORDER BY country DESC") 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('shipping', where='id=' + 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('shipping', country=i.country, price=i.price, days=i.days) 682 <a href="#l664" class="line" id="l664"> 664</a> raise web.seeother('/shipping/') 683 <a href="#l665" class="line" id="l665"> 665</a> else: 684 <a href="#l666" class="line" id="l666"> 666</a> raise web.seeother('/login') 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>