--- /dev/null
+#!/usr/bin/env python
+
+from __future__ import division
+import web
+import sys, os, re
+from storm.locals import *
+from ruler import RulerImage
+
+# the url map for the application
+urls = ( '/', 'index',
+ '/ruler_([0-9\.]+)px_([0-9\.]+)([A-Za-z]+).(svg|png|jpg)', 'ruler_img',
+ '/show/(.*(svg|png|jpg))', 'ruler',
+ '/gallery(.*)', 'gallery',
+ '/delete/(\d+)', 'delete',
+ '/undelete/(\d+)', 'undelete')
+
+database = create_database("sqlite:ruler_web.db")
+store = Store(database)
+
+class SavedRuler(object):
+ __storm_table__ = "gallery"
+ id = Int(primary=True)
+ pixel_width = Float()
+ unit_width = Float()
+ model = Unicode()
+ units = Unicode()
+ show = Int()
+
+ def __init__(self, **kw):
+ self.pixel_width = kw['pixel_width']
+ self.unit_width = kw['unit_width']
+ self.units = kw['units']
+ self.model = kw['model']
+
+ def cm_width(self):
+ if self.units == 'centimeters':
+ return self.unit_width
+ elif self.units == 'inches':
+ return(self.unit_width * 2.54)
+
+ def in_width(self):
+ if self.units == 'inches':
+ return self.unit_width
+ elif self.units == 'centimeters':
+ return(self.unit_width * 0.3937)
+
+
+class index:
+ def GET(self):
+ web.header("Content-Type","text/html; charset=utf-8")
+ web.render('index.tmpl')
+
+ def POST(self):
+ input = web.input()
+
+ pixel_width = input['pixel_width']
+ unit_width = input['unit_width']
+ units = input['units']
+ ruler_url = 'ruler_%spx_%s%s.png' % (pixel_width, unit_width, units)
+ web.redirect('/show/%s' % ruler_url)
+
+class ruler:
+ def GET(self, ruler_url, ext):
+ web.debug('test test')
+ if web.input().has_key('fromgallery'):
+ fromgallery = True
+ else:
+ fromgallery = False
+
+ other_unit, other_unit_url = get_other_units(ruler_url)
+
+ web.header("Content-Type","text/html; charset=utf-8")
+ web.render('show_ruler.tmpl')
+
+
+class ruler_img:
+ def GET(self, pixel_width=None, unit_width=None, units=None, ext=None):
+
+ # TODO check to see if it's a format that we support
+
+ # set ruler height to be 200 px always
+ pixel_width = float(pixel_width)
+ unit_width = float(unit_width)
+
+ ruler_height = 200
+
+ scale = pixel_width / unit_width
+ ruler_length = int(unit_width)
+
+ ruler = Ruler(scale, units, ruler_height, ruler_length)
+
+ # print the header
+ if ext == 'svg': ext = 'svg+xml'
+ web.header("Content-Type", "image/%s" % ext)
+
+ if ext == 'svg+xml':
+ sys.stdout.write(ruler.output())
+ else:
+ pin, pout = os.popen2('convert -size %sx%s - %s:-' % \
+ (pixel_width, ruler_height, ext))
+
+ pin.write(ruler.output())
+ pin.close()
+ sys.stdout.write(pout.read())
+
+class gallery:
+ def GET(self, ruler_url):
+
+ if ruler_url:
+ pixel_width, unit_width, units = process_ruler_url(ruler_url)[0:3]
+
+ rulers = store.find(SavedRuler, SavedRuler.show == 1)
+ rulers.order_by(SavedRuler.model)
+
+ web.render('gallery.tmpl')
+
+ def POST(self):
+ input = web.input()
+
+ new_ruler = SavedRuler(pixel_width=float(input['pixel_width']),
+ unit_width=float(input['unit_width']),
+ units=unicode(input['units']),
+ model=unicode(input['model']))
+
+ store.add(new_ruler)
+ store.commit()
+
+ web.redirect('gallery')
+
+class delete:
+ def GET(self, id):
+ ruler = store.get(SavedRuler, int(id))
+ ruler.show = 0
+ store.commit()
+ web.redirect('/gallery')
+
+
+class undelete:
+ def GET(self, id):
+ ruler = store.get(SavedRuler, int(id))
+ ruler.show = 1
+ store.commit()
+ web.redirect('/gallery')
+
+def get_other_units(url):
+ pixel_width, unit_width, units = process_ruler_url(url)[0:3]
+ ruler = SavedRuler(pixel_width=float(pixel_width),
+ unit_width=float(unit_width),
+ units=unicode(units),
+ model=unicode(model))
+
+def process_ruler_url(url):
+ url = re.sub(r'^/?(ruler.*)$', r'\1', url)
+ return(re.match( r'ruler_([\d\.]+)px_([\d\.]+)(\w+).(png|svg|jpg)',
+ url).groups())
+
+# render the site template here so that i can use it later
+web.render('site.tmpl', None, True, 'site')
+
+web.webapi.internalerror = web.debugerror
+if __name__ == "__main__":
+ web.run(urls, globals(), web.reloader)
+