def new(self, dbType, environ): name = dbType.__name__ if environ["REQUEST_METHOD"] == "POST": pquery = parseURLEncoded(environ) inst = dbType.new() for field in dbType.fieldTypes: if field not in ("cdate", "id"): if field in pquery: value = pquery[field][0] inst.__setattr__(field, value) inst.save() for ref in dbType.has_many: refName = ref.__name__ if refName in pquery: refIDs = [int(_) for _ in pquery[refName]] print refName, refIDs if ref in dbType.singular_refs: refID = int(pquery[refName][0]) if refID: refInst = ref.select_id(refID) inst.setRef(refInst) else: for refID in refIDs: if not refID: continue refInst = ref.select_id(refID) inst.setRef(refInst) biggerScript = noEscapeBlank( """<script type="text/javascript"> function bigger(id) { document.getElementById(id).rows *= 2; }</script>""") f = form(action=os.path.join("/",name, "new"), method="POST") f.add(biggerScript) t = table() for field in dbType.fieldTypes: if field not in ("cdate", "id"): t.add(tr(td(field), td(textarea(rows="1", cols="80", name=field, id="text_%s" % field)("")), td(button(type="button", onmousedown="bigger('text_%s')" % field)("+")))) for ref in dbType.has_many: refName = ref.__name__ if ref not in dbType.singular_refs: selection = select(name=refName, multiple="multiple") else: selection = select(name=refName) selection.add(option(value=0)("--")) attr = self.displayValues.get(ref, "id") selection.add(option(value=refInst.id)(refInst.__getattr__(attr)) for refInst in ref) t.add(tr(td(refName), td(selection))) f.add(t) f.add(input(type="submit")) return blank(h1("new " + name), f)
def edit(self, dbType, environ): query = parse_query_string(environ['QUERY_STRING']) if "id" in query: dbid = query["id"][0] try: inst = dbType.select_id(int(dbid)) except (IndexError, ValueError): return "Invalid ID" name = dbType.__name__ if environ["REQUEST_METHOD"] == "POST": pquery = parseURLEncoded(environ) for field in dbType.fieldTypes: if field not in ("cdate", "id"): if field in pquery: value = pquery[field][0] inst.__setattr__(field, value) inst.save() for ref in dbType.has_many: refName = ref.__name__ if refName in pquery: refIDs = [int(_) for _ in pquery[refName]] if ref in dbType.singular_refs: try: refInst = list(inst.getRefs(ref))[0] inst.deleteRef(refInst) except: pass refID = int(pquery[refName][0]) if refID: refInst = ref.select_id(refID) inst.setRef(refInst) else: for refInst in inst.getRefs(ref): inst.deleteRef(refInst) for refID in refIDs: if not refID: continue refInst = ref.select_id(refID) inst.setRef(refInst) print inst.getRefCount(ref) inst = dbType.select_id(int(dbid)) biggerScript = noEscapeBlank( """<script type="text/javascript"> function bigger(id) { document.getElementById(id).rows *= 2; }</script>""") f = form(action=os.path.join("/",name, "edit?id=%s" % inst.id), method="POST") f.add(biggerScript) t = table() for field in dbType.fieldTypes: if field not in ("cdate", "id"): t.add(tr(td(field), td(textarea(id="text_%s" % field, rows="1", cols="80", name=field)(inst.__getattr__(field))), td(button(type="button", onmousedown="bigger('text_%s')" % field)("+")) )) for ref in dbType.has_many: refName = ref.__name__ refIDs = []# try: for refInst in inst.getRefs(ref): refIDs.append(refInst.id) except: pass if ref not in dbType.singular_refs: selection = select(name=refName, multiple="multiple") else: selection = select(name=refName) selection.add(option(value=0)("--")) attr = self.displayValues.get(ref, "id") selection.add(option(value=refInst.id)(refInst.__getattr__(attr)) for refInst in ref if refInst.id not in refIDs) selection.add(option(value=refInst.id, selected="selected")(refInst.__getattr__(attr)) for refInst in ref if refInst.id in refIDs) t.add(tr(td(refName), td(selection))) f.add(t) f.add(input(type="submit")) return blank(h1(' '.join(("edit", name, unicode(inst.id)))), f) return blank()
def __call__(self, environ, start_response): path = urllib.unquote(environ["PATH_INFO"]) innerhtml = blank() status = "200 OK" headers = headers = [('Content-type', 'text/html; charset=UTF-8')] if path == "/" or path == "/list": query = helpers.parse_query_string(environ['QUERY_STRING']) if "delid" in query: try: delid = int(query.get("delid")[0]) inst = DownloadEntry.select_id(delid) DownloadEntry.delete(inst) except: pass if "retryid" in query: try: retryid = int(query.get("retryid")[0]) inst = DownloadEntry.select_id(retryid) inst.error='' except: pass if "clearErrors" in query: for entry in DownloadEntry.select_cond(cond="NOT error=''"): DownloadEntry.delete(entry) if "clearFinished" in query: for entry in DownloadEntry.select(finished=1): DownloadEntry.delete(entry) errorButton = form(action="/list")(input(type="submit", value="Clear errors"), input(type="hidden", name="clearErrors")) finishButton = form(action="/list?clearFinished")(input(type="submit", value="Clear finished downloads"), input(type="hidden", name="clearFinished")) dlist = self.downloadList() dlist.add(tr(td(finishButton), td(colspan="5")(errorButton))) innerhtml = dlist elif path == "/create": if environ["REQUEST_METHOD"] == "POST": msg = blank() query = helpers.parseURLEncoded(environ) print query url = query.get("url") destination = query.get("destination") ratelimit = query.get("ratelimit") if not "edit" in query: if not url: msg = b("No URL given!") else: if not destination: msg = b("No destination given!") else: if not ratelimit: ratelimit = 0 else: ratelimit = ratelimit[0] url = url[0] destination = destination[0] if not url.startswith("http://"): url = "http://"+url dl = DownloadEntry.new(url=url, destination=destination, ratelimit=ratelimit, active=0, finished=0, error='') msg = "Added Entry" innerhtml = blank(p(msg), self.creationForm()) else: innerhtml = self.creationForm(url[0], destination[0], ratelimit[0]) else: innerhtml = self.creationForm() elif path == "/config": defaults = Defaults.select_id(1) msg = blank() if environ["REQUEST_METHOD"] == "POST": query = helpers.parseURLEncoded(environ) print query destination = query.get("destination") if not destination: msg = b("Destination not given!") else: ratelimit = query.get("ratelimit") if ratelimit is None: msg = b("Rate Limit not given!") else: destination = destination[0] try: ratelimit = int(ratelimit[0]) defaults.ratelimit = ratelimit except ValueError: msg = b("Rate Limit must be a number!") ratelimit = defaults.ratelimit if not os.path.isdir(destination): try: os.makedirs(destination) defaults.destination = destination except OSError: msg = b("Invalid destination!") else: defaults.destination = destination innerhtml = blank( h1("Defaults"), msg, form(action="/config", method="POST")( table( tr( td("Destination"), td(input(type="text", name="destination", value=defaults.destination)) ), tr( td("Rate Limit (in B)"), td(input(type="text", name="ratelimit", value=defaults.ratelimit)) ), tr( td(input(type="submit")) ) ) )) else: status = "404 Not found" headers = [('Content-type', 'text/html; charset=UTF-8')] innerhtml= b("404 File not found.") yield str(XHTML10DTD()) src = \ html( noEscapeBlank('<meta http-equiv="Content-Type" content="text/html; charset=utf-8">'), body( table( tr( td(self.menu()), td(innerhtml) ) ) ) ) yield str(src)