You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
преди 14 години
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. import sys, os
  2. import webnotes
  3. import webnotes.defs
  4. import webnotes.utils
  5. form = webnotes.form
  6. form_dict = webnotes.form_dict
  7. sql = None
  8. session = None
  9. errdoc = ''
  10. errdoctype = ''
  11. errmethod = ''
  12. fw_folder = '/Users/rushabh/workbench/www/'
  13. # Logs
  14. # refresh / start page
  15. # ------------------------------------------------------------------------------------
  16. def startup():
  17. import webnotes
  18. import webnotes.session_cache
  19. webnotes.response.update(webnotes.session_cache.get())
  20. def cleanup_docs():
  21. import webnotes.model.utils
  22. if webnotes.response.get('docs') and type(webnotes.response['docs'])!=dict:
  23. webnotes.response['docs'] = webnotes.model.utils.compress(webnotes.response['docs'])
  24. # server calls
  25. # ------------------------------------------------------------------------------------
  26. def runserverobj(arg=None):
  27. import webnotes.widgets.form
  28. webnotes.widgets.form.runserverobj()
  29. def logout():
  30. webnotes.login_manager.logout()
  31. # DocType Mapper
  32. # ------------------------------------------------------------------------------------
  33. def dt_map():
  34. import webnotes
  35. import webnotes.model.utils
  36. from webnotes.model.code import get_obj
  37. from webnotes.model.doc import Document
  38. form_dict = webnotes.form_dict
  39. dt_list = webnotes.model.utils.expand(form_dict.get('docs'))
  40. from_doctype = form_dict.get('from_doctype')
  41. to_doctype = form_dict.get('to_doctype')
  42. from_docname = form_dict.get('from_docname')
  43. from_to_list = form_dict.get('from_to_list')
  44. dm = get_obj('DocType Mapper', from_doctype +'-' + to_doctype)
  45. dl = dm.dt_map(from_doctype, to_doctype, from_docname, Document(fielddata = dt_list[0]), [], from_to_list)
  46. webnotes.response['docs'] = dl
  47. # Load Month Events
  48. # ------------------------------------------------------------------------------------
  49. def load_month_events():
  50. import webnotes
  51. form = webnotes.form
  52. mm = form.getvalue('month')
  53. yy = form.getvalue('year')
  54. m_st = str(yy) + '-' + str(mm) + '-01'
  55. m_end = str(yy) + '-' + str(mm) + '-31'
  56. import webnotes.widgets.event
  57. webnotes.response['docs'] = webnotes.widgets.event.get_cal_events(m_st, m_end)
  58. # Data import
  59. # ------------------------------------------------------------------------------------
  60. def import_csv():
  61. import webnotes.model.import_docs
  62. form = webnotes.form
  63. from webnotes.utils import cint
  64. i = webnotes.model.import_docs.CSVImport()
  65. r = i.import_csv(form.getvalue('csv_file'), form.getvalue('dateformat'), form_dict.get('overwrite', 0) and 1)
  66. webnotes.response['type']='iframe'
  67. rhead = '''<style>body, html {font-family: Arial; font-size: 12px;}</style>'''
  68. webnotes.response['result']= rhead + r
  69. def get_template():
  70. import webnotes.model.import_docs
  71. webnotes.model.import_docs.get_template()
  72. # File Upload
  73. # ------------------------------------------------------------------------------------
  74. def uploadfile():
  75. import webnotes.utils.file_manager
  76. if webnotes.form_dict.get('from_form'):
  77. webnotes.utils.file_manager.upload()
  78. else:
  79. # save the file
  80. fid, fname = webnotes.utils.file_manager.save_uploaded()
  81. # do something with the uploaded file
  82. if fid and webnotes.form_dict.get('server_obj'):
  83. from webnotes.model.code import get_obj
  84. getattr(get_obj(webnotes.form_dict.get('server_obj')), webnotes.form_dict.get('method'))(fid, fname)
  85. # return the upload
  86. if fid:
  87. webnotes.response['result'] = '<script>window.parent.upload_callback("'+webnotes.form_dict.get('uploader_id')+'", "'+fid+'")</script>'
  88. # File upload (from scripts)
  89. # ------------------------------------------------------------------------------------
  90. def upload_many():
  91. from webnotes.model.code import get_obj
  92. # pass it on to upload_many method in Control Panel
  93. cp = get_obj('Control Panel')
  94. cp.upload_many(webnotes.form)
  95. webnotes.response['result'] = """
  96. <script type='text/javascript'>
  97. %s
  98. </script>
  99. %s
  100. %s""" % (cp.upload_callback(webnotes.form), '\n----\n'.join(webnotes.message_log).replace("'", "\'"), '\n----\n'.join(webnotes.debug_log).replace("'", "\'").replace("\n","<br>"))
  101. webnotes.response['type'] = 'iframe'
  102. # File download
  103. # ------------------------------------------------------------------------------------
  104. def get_file():
  105. import webnotes.utils.file_manager
  106. res = webnotes.utils.file_manager.get_file(form.getvalue('fname'))
  107. if res:
  108. webnotes.response['type'] = 'download'
  109. webnotes.response['filename'] = res[0]
  110. if hasattr(res[1], 'tostring'):
  111. webnotes.response['filecontent'] = res[1].tostring()
  112. else:
  113. webnotes.response['filecontent'] = res[1]
  114. else:
  115. webnotes.msgprint('[get_file] Unknown file name')
  116. # Get Graph
  117. # ------------------------------------------------------------------------------------
  118. def get_graph():
  119. form = webnotes.form
  120. import StringIO
  121. f = StringIO.StringIO()
  122. # call the object
  123. obj = server.get_obj(form_dict.get('dt'))
  124. plt = server.run_server_obj(obj, form_dict.get('method'), form_dict.get('arg'))
  125. plt.savefig(f)
  126. # stream out
  127. webnotes.response['type'] = 'download'
  128. webnotes.response['filename'] = webnotes.user.get_random_password() + '.png'
  129. webnotes.response['filecontent'] = f.getvalue()
  130. # Reset Password
  131. # ------------------------------------------------------------------------------------
  132. def reset_password():
  133. form_dict = webnotes.form_dict
  134. act = form_dict.get('account', '')
  135. user = form_dict.get('user', '')
  136. if act:
  137. webnotes.conn.set_db(act)
  138. try:
  139. p = webnotes.profile.Profile(user)
  140. p.reset_password()
  141. webnotes.msgprint("Password has been reset and sent to your email id.")
  142. except Exception, e:
  143. webnotes.msgprint(str(e))
  144. # Resume session
  145. # ------------------------------------------------------------------------------------
  146. def resume_session():
  147. webnotes.response['message'] = webnotes.session_obj.resume()
  148. # -------------
  149. # Create Backup
  150. # -------------
  151. def backupdb(form_dict, session):
  152. db_name = server.decrypt(form_dict.get('db_name'))
  153. server.backup_db(db_name)
  154. webnotes.response['type'] = 'download'
  155. webnotes.response['filename'] = db_name+'.tar.gz'
  156. webnotes.response['filecontent'] = open('../backups/' + db_name+'.tar.gz','rb').read()
  157. # ---------------------------------------------------------------------
  158. def validate_cmd(cmd):
  159. # check if there is no direct possibility of malicious script injection
  160. if cmd.startswith('webnotes.model.code'):
  161. raise Exception, 'Cannot call any methods from webnotes.model.code directly from the handler'
  162. if cmd.startswith('webnotes.model.db_schema'):
  163. raise Exception, 'Cannot call any methods from webnotes.model.db_schema directly from the handler'
  164. if cmd.startswith('webnotes.conn'):
  165. raise Exception, 'Cannot call database connection method directly from the handler'
  166. # Execution Starts Here
  167. # ---------------------------------------------------------------------
  168. import webnotes.auth
  169. import webnotes.db
  170. # reset password
  171. # ---------------------------------------------------------------------
  172. if form_dict.has_key('cmd') and (form_dict.get('cmd')=='reset_password'):
  173. webnotes.conn = webnotes.db.Database(use_default = 1)
  174. sql = webnotes.conn.sql
  175. sql("START TRANSACTION")
  176. try:
  177. reset_password()
  178. sql("COMMIT")
  179. except Exception, e:
  180. webnotes.errprint(str(e))
  181. sql("ROLLBACK")
  182. # pre-login access - for registration etc.
  183. # ---------------------------------------------------------------------
  184. elif form_dict.has_key('cmd') and (form_dict.get('cmd')=='prelogin'):
  185. webnotes.conn = webnotes.db.Database(use_default = 1)
  186. sql = webnotes.conn.sql
  187. webnotes.session = {'user':'Administrator'}
  188. import webnotes.model.code
  189. sql("START TRANSACTION")
  190. try:
  191. webnotes.response['message'] = webnotes.model.code.get_obj('Profile Control').prelogin(form_dict) or ''
  192. sql("COMMIT")
  193. except:
  194. webnotes.errprint(webnotes.utils.getTraceback())
  195. sql("ROLLBACK")
  196. # main stuff
  197. # ---------------------------------------------------------------------
  198. else:
  199. try:
  200. webnotes.request = webnotes.auth.HTTPRequest()
  201. if form_dict.get('cmd') != 'login' and webnotes.conn:
  202. sql = webnotes.conn.sql
  203. # NOTE:
  204. # guest should only be allowed:
  205. # getdoc (if Guest access)
  206. # runserverobj (if Guest access)
  207. # get command cmd
  208. cmd = form_dict.has_key('cmd') and form_dict.get('cmd') or ''
  209. read_only = form_dict.has_key('_read_only') and form_dict.get('_read_only') or None
  210. validate_cmd(cmd)
  211. module = ''
  212. if '.' in cmd:
  213. module = '.'.join(cmd.split('.')[:-1])
  214. cmd = cmd.split('.')[-1]
  215. exec 'from %s import %s' % (module, cmd) in locals()
  216. # execute
  217. if locals().has_key(cmd):
  218. if (not webnotes.conn.in_transaction) and (not read_only):
  219. webnotes.conn.begin()
  220. if webnotes.form_dict.get('arg'):
  221. # direct method call
  222. ret = locals()[cmd](webnotes.form_dict.get('arg'))
  223. else:
  224. ret = locals()[cmd]()
  225. # returns with a message
  226. if ret:
  227. webnotes.response['message'] = ret
  228. # update session
  229. webnotes.session_obj.update()
  230. if webnotes.conn.in_transaction:
  231. webnotes.conn.commit()
  232. else:
  233. if cmd!='login':
  234. webnotes.msgprint('No Method: %s' % cmd)
  235. except webnotes.ValidationError:
  236. webnotes.conn.rollback()
  237. except:
  238. webnotes.errprint(webnotes.utils.getTraceback())
  239. webnotes.conn and webnotes.conn.rollback()
  240. #### cleanup
  241. #-----------
  242. if webnotes.conn:
  243. webnotes.conn.close()
  244. #### go
  245. import string
  246. import os
  247. acceptsGzip, out_buf, str_out = 0, None, None
  248. try:
  249. if string.find(os.environ["HTTP_ACCEPT_ENCODING"], "gzip") != -1:
  250. acceptsGzip = 1 # problem in win ?
  251. except:
  252. pass
  253. def compressBuf(buf):
  254. import gzip, cStringIO
  255. zbuf = cStringIO.StringIO()
  256. zfile = gzip.GzipFile(mode = 'wb', fileobj = zbuf, compresslevel = 5)
  257. zfile.write(buf)
  258. zfile.close()
  259. return zbuf.getvalue()
  260. # CSV
  261. # -------------------------------------------------------------------
  262. if webnotes.response.get('type')=='csv':
  263. print "Content-Type: text/csv"
  264. print "Content-Disposition: attachment; filename="+webnotes.response['doctype'].replace(' ', '_')+".csv"
  265. print
  266. print webnotes.response['result']
  267. # IFRAME
  268. # -------------------------------------------------------------------
  269. elif webnotes.response.get('type')=='iframe':
  270. print "Content-Type: text/html"
  271. print
  272. if webnotes.response.get('result'):
  273. print webnotes.response['result']
  274. if webnotes.debug_log:
  275. print '''<script type='text/javascript'>alert("%s");</script>''' % ('-------'.join(webnotes.debug_log).replace('"', '').replace('\n',''))
  276. # file
  277. # -------------------------------------------------------------------
  278. elif webnotes.response.get('type')=='download':
  279. import mimetypes
  280. print "Content-Type: %s" % (mimetypes.guess_type(webnotes.response['filename'])[0] or 'application/unknown')
  281. print "Content-Disposition: filename="+webnotes.response['filename'].replace(' ', '_')
  282. print
  283. print webnotes.response['filecontent']
  284. # JSON
  285. # -------------------------------------------------------------------
  286. else:
  287. if webnotes.debug_log:
  288. save_log = 1
  289. if webnotes.debug_log[0].startswith('[Validation Error]'):
  290. save_log = 0
  291. t = '\n----------------\n'.join(webnotes.debug_log)
  292. if errdoctype:
  293. t = t + '\nDocType: ' + errdoctype
  294. if errdoc:
  295. t = t + '\nName: ' + errdoc
  296. if errmethod:
  297. t = t + '\nMethod: ' + errmethod
  298. webnotes.response['exc'] = '<pre>'+t.replace('\n','<br>')+'</pre>'
  299. if save_log: # don't save validation errors
  300. try: save_log(t, 'Server')
  301. except: pass
  302. if webnotes.message_log:
  303. webnotes.response['server_messages'] = '\n----------------\n'.join(webnotes.message_log)
  304. cleanup_docs()
  305. # Convert to JSON
  306. # ---------------
  307. try:
  308. import json
  309. except: # python 2.4
  310. import simplejson as json
  311. str_out = json.dumps(webnotes.response)
  312. if acceptsGzip and 1 and len(str_out)>512:
  313. out_buf = compressBuf(str_out)
  314. print "Content-Encoding: gzip"
  315. print "Content-Length: %d" % (len(out_buf))
  316. print "Content-Type: text/html; charset: utf-8"
  317. # if there ar additional cookies defined during the request, add them here
  318. if webnotes.cookies or webnotes.add_cookies:
  319. for c in webnotes.add_cookies.keys():
  320. webnotes.cookies[c] = webnotes.add_cookies[c]
  321. print webnotes.cookies
  322. print # Headers end
  323. if out_buf:
  324. sys.stdout.write(out_buf)
  325. elif str_out:
  326. print str_out