Source code for gavo.web.uploadservice

"""
Renderers supporting upload cores.
"""

#c Copyright 2008-2023, the GAVO project <gavo@ari.uni-heidelberg.de>
#c
#c This program is free software, covered by the GNU GPL.  See the
#c COPYING file in the source distribution.


from twisted.web import template
from twisted.web.template import tags as T

from gavo import base
from gavo.web import formrender
from gavo.web import weberrors


[docs]class Uploader(formrender.FormRenderer): """A renderer allowing for updates to individual records using file upload. This renderer exposes a form with a file widget. It is likely that the interface will change. """ name = "upload"
[docs] @template.renderer def uploadInfo(self, request, tag): data = tag.slotData if data is None: return T.transparent() else: for key, val in data.getPrimaryTable().rows[0].items(): tag.fillSlots(key, str(val)) return tag
loader = template.TagLoader(T.html[ T.head[ T.title["Upload"], T.transparent(render="commonhead"), ], T.body(render="withsidebar")[ T.h1(render="meta")["title"], T.p(class_="procMessage", data="result", render="uploadInfo")[ template.slot(name="nAffected"), " record(s) modified." ], T.transparent(render="form genForm") ] ])
[docs]class MachineUploader(Uploader): """A renderer allowing for updates to individual records using file uploads. The difference to Uploader is that no form-redisplay will be done. All errors are reported through HTTP response codes and text strings. It is likely that this renderer will change and/or go away. """ name = "mupload" def _handleInputErrors(self, failure, request): request.setResponseCode(500) request.setHeader("content-type", "text/plain;charset=utf-8") request.write(failure.getErrorMessage().encode("utf-8")) request.finish() base.ui.notifyFailure(failure) return weberrors.Silence() def _notifyNonModified(self, data, request): request.setResponseCode(400) request.setHeader("content-type", "text/plain;charset=utf-8") request.write(("Uploading %s did not change data database.\nThis" " usually happens when the file already existed for an insert" " or did not exist for an update.\n"%( self.queryMeta["inputTable"].getParamDict()["File"][0], )).encode("utf-8")) request.finish() def _formatOutput(self, data, request): numAffected = data.getPrimaryTable().rows[0]["nAffected"] if numAffected==0: return self._notifyNonModified(data, request) request.setResponseCode(200) request.setHeader("content-type", "text/plain;charset=utf-8") request.write(("%s uploaded, %d records modified\n"%( self.queryMeta["inputTable"].getParamDict()["File"][0], numAffected)).encode("utf-8")) request.finish()