Advertisement
Arusekk

librus.py

May 3rd, 2016
250
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 20.09 KB | None | 0 0
  1. #!/usr/bin/python
  2. # -*- coding: utf -*-
  3.  
  4. import code, urllib, urllib2, os, sys, re, cookielib, time, traceback
  5. import glob
  6. try:
  7.   from bazaocen import baza
  8. except:
  9.   baza=[]
  10. from HTMLParser import HTMLParser
  11. from htmlentitydefs import name2codepoint
  12. from email.header import make_header
  13. from subprocess import *
  14.  
  15. cookielib.debug = True
  16.  
  17. #librfmt='%F'
  18. librfmt='%Y-%m-%d'
  19. rfc822fmt='%a, %e %b %Y %T %z'
  20.  
  21. class MyCookiePolicy(cookielib.DefaultCookiePolicy):
  22.     def set_ok(self, cookie, request):
  23.     return True
  24.  
  25. class RedirHandler(urllib2.HTTPRedirectHandler):
  26.     def redirect_request(self, oldreq, fp, code, msg, hdrs, newurl):
  27.     global req
  28.     #print (req,fp,code,msg,hdrs,newurl)
  29.     jar.extract_cookies(fp,oldreq)
  30.     if url.find('?')!=-1:
  31.       newurl+=url[url.find('?'):]
  32.     req=urllib2.Request(newurl, None, hdrs)
  33.     jar.add_cookie_header(req)
  34.         return req
  35.  
  36. cookiefn='kukis.txt'
  37. jar=cookielib.MozillaCookieJar(cookiefn,True)#,MyCookiePolicy)
  38.  
  39. direct=urllib2.build_opener(RedirHandler)
  40.  
  41. host = "synergia.librus.pl"
  42. site = 'https://%s/loguj/przenies'%host
  43. username = '1234567u'
  44. password = '#jestembogiem'
  45. url = site + '/przegladaj_oceny/uczen'
  46. headers = {
  47. "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0",
  48. "Host" : host,
  49. "Referer" : url,
  50. "Connection" : "keep-alive",
  51. "Cache-Control" : "max-age=0",
  52. "Accept-Language" : "pl,en-us;q=0.7,en;q=0.3",
  53. "Accept-Encoding" : "gzip, deflate",
  54. "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
  55. #"Accept-Charset" : "utf-8,ISO-8859-2;q=0.8,*;q=0.7"
  56. }
  57. data = [
  58. ("login",username),
  59. ("passwd",password),
  60. ("czy_js",1)
  61. ]
  62. fn='result.html'
  63.  
  64.  
  65. def safemakeheaderu8(t, quoted=''):
  66.     try:
  67.     return quoted+make_header([(t,'ascii')]).encode()+quoted
  68.     except:
  69.     return make_header([(t,'utf-8')]).encode()
  70.  
  71. def dodal(entry):
  72.     x=entry.get('Dodał'.decode('utf'), 'NIEDODAŁ2').split('(')[0].strip()
  73.     return x.split(' ')[-1],' '.join(x.split(' ')[:-1])
  74.  
  75. def glue(L):
  76.     ret=''
  77.     prev='\n'
  78.     for i in L:
  79.     if prev.endswith('\n') or i.startswith('\n'):
  80.         pass
  81.     else:
  82.         ret+='\n'
  83.     try:
  84.         ret+=i
  85.     except UnicodeDecodeError,e: # why?! all items are str
  86.         try:
  87.         ret+=repr(i.replace(u'\xa0',' '))[2:-1]
  88.         except UnicodeDecodeError,e2:
  89.         print "UnicodeDecodeError:",e
  90.         ret+="<really stupid unicode text>"
  91.     prev=i
  92.     return (ret[:-1] if ret.endswith('\n') else ret)
  93.  
  94. def attrfmt(x):
  95.     x=list(x)
  96.     if x[1]==None: x[1]=''
  97.     x[1]=x[1].replace('&','&amp;').replace('"','&quot;').encode('ascii', 'xmlcharrefreplace')
  98.     return str(' %s="%s"'%tuple(x))
  99.  
  100.  
  101. def wrap_HTML(x):
  102.     return '''
  103. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
  104. <html><head><meta name="qrichtext" content="1" /><style type="text/css">
  105. p, li { white-space: pre-wrap; }
  106. table { border: 3px outset; }
  107. th, td { border: 3px inset; }
  108. th { text-align: right; }
  109. </style></head><body><table border="3">
  110. %s
  111. </table></body></html>
  112. '''%(x.replace('\r\n',' ').replace('  ',' ').replace('  ',' ').replace('  ',' ').replace('> <','><'))
  113.  
  114.  
  115.  
  116. def update():
  117.     global req,fn,url
  118.     headers['Referer'] = url
  119.     postdata = urllib.urlencode(dict(data))
  120.     req = urllib2.Request(url, postdata, dict(headers))
  121.     jar.add_cookie_header(req)
  122.     h = req.get_header('Cookie')
  123.     if h and h.find('DZIENNIKSID') != -1:
  124.       url = url.replace('/loguj/przenies','')
  125.       req = urllib2.Request(url, None, dict(headers))
  126.     jar.add_cookie_header(req)
  127.     print ('Sent headers are: {')
  128.     for it in req.header_items():
  129.     print ('%20r: %r'%it)
  130.     print ('}')
  131.     response = direct.open(req)
  132.     jar.extract_cookies(response,req)
  133.     print ('url is %s'%response.geturl())
  134.     print ('Received headers are: {')
  135.     for it in response.info().items():
  136.     print ('%20r: %r'%it)
  137.     print ('}')
  138.     if response.info().get("transfer-encoding")=='gzip':
  139.     fn+='.gz'
  140.     if response.info().get("content-encoding")=='gzip':
  141.     fn+='.gz'
  142.     with open(fn, 'w+b') as fp:
  143.     buff=response.read(1024)
  144.     while buff!='':
  145.         fp.write(buff)
  146.         buff=response.read(1024)
  147.     response.close()
  148.     if fn.endswith('.gz'):
  149.     Popen(["gunzip","-f",fn]).wait()
  150.     fn=fn[:-3]
  151.     print ('done')
  152.  
  153.  
  154. def get_details(href):
  155.     global fn,url
  156.     oldfn,fn=fn,'oceny_szczegoly/%s.html'%(href.split('/')[-1])
  157.     url = site + href
  158.     if not os.path.isfile(fn):
  159.     update()
  160.     try:
  161.       ret=parse2()
  162.     except:
  163.       print "plik problemu:",fn
  164.       raise
  165.     fn=oldfn
  166.     return ret
  167.  
  168.  
  169. #def get_msg(href):
  170.     #global fn,url
  171.     #oldfn,fn=fn,'msg_szczegoly/%s.html'%(href.split('/')[-1])
  172.     #url = site + href
  173.     #if not os.path.isfile(fn):
  174.     #update()
  175.     #ret=parse2()
  176.     #fn=oldfn
  177.     #return ret
  178.  
  179.  
  180.  
  181.  
  182. class MyHTMLNode(object):
  183.     MX_CONTENT_LEN=16
  184.     problem=[]
  185.     def __init__(self):
  186.     self.parentNode=None
  187.     self.childNodes=[]
  188.     def appendChild(self, elem, idx=None):
  189.     if isinstance(elem, MyHTMLData):
  190.         if self.childNodes and isinstance(self.childNodes[-1], MyHTMLData):
  191.         self.childNodes[-1].dane+=elem.dane
  192.         return
  193.     if idx is None:
  194.         self.childNodes.append(elem)
  195.     else:
  196.         self.childNodes.insert(idx,elem)
  197.     elem.parentNode=self
  198.     if hasattr(elem, 'event'):
  199.         elem.event()
  200.     def _HTML(self):
  201.     raise NotImplementedError
  202.     def __repr__(self):
  203.     #return "<%s%s at 0x%x%s%s>"%(self.nodeName+' ' if isinstance(self,MyHTMLElement) else "",type(self).__name__,id(self),", whose attrs=%r"%dict(self.attrs) if isinstance(self,MyHTMLElement) and self.attrs else "",", whose childNodes=%r"%self.childNodes if self.childNodes else '')
  204.     return "<%s%s at 0x%x%s%s>"%(self.nodeName+' ' if isinstance(self,MyHTMLElement) else "",type(self).__name__,id(self),", whose attrs=%r"%dict(self.attrs) if isinstance(self,MyHTMLElement) and self.attrs else ""," with childNodes" if self.childNodes else '')
  205.     HTML=property(lambda self:self._HTML())
  206.  
  207. class MyHTMLElement(MyHTMLNode):
  208.     tables=[]
  209.     def __init__(self,nodeName,attrs):
  210.     MyHTMLNode.__init__(self)
  211.     self.nodeName=nodeName
  212.     self.attrs=attrs
  213.     if nodeName=='document':
  214.         del self.tables[:]
  215.     if nodeName=='table':
  216.         self.tables.append(self)
  217.         self.tbody = self
  218.     if nodeName=='a':
  219.         href=dict(attrs).get('href','')
  220.         if href.startswith('/przegladaj_oceny/szczegoly/') and href not in oceny_ids:
  221.         oceny_ids.append(href)
  222.     def event(self):
  223.     if self.nodeName in ('thead','tbody','tfoot'):
  224.         setattr(self.parentNode, self.nodeName, self)
  225.     elif self.nodeName=='a':
  226.         magia="otworz_w_nowym_oknie('/zapytaj_nauczyciela/"
  227.         magia2="', 'ask',700,600)"
  228.         onclick=dict(self.attrs).get('onclick','')
  229.         if onclick.startswith(magia) and onclick.endswith(magia2):
  230.         tree=self.parentNode
  231.         while tree.nodeName!='document':
  232.             tree=tree.parentNode
  233.         nau=MyHTMLElement('nauczyciel',[])
  234.         nau.appendChild(MyHTMLData(onclick[len(magia):-len(magia2)]))
  235.         tree.appendChild(nau,0)
  236.     def _innerHTML(self,indent=0):
  237.       return glue(map(lambda x:x._HTML(indent+1), self.childNodes)).replace('\n','\n'+'  ') #*indent)
  238.     innerHTML=property(_innerHTML)
  239.     def _HTML(self, indent=0):
  240.     try:
  241.         innerHTML=self._innerHTML(indent)
  242.         if len(innerHTML)>self.MX_CONTENT_LEN: innerHTML='\n  %s\n'%innerHTML
  243.         if innerHTML or self.nodeName not in ("link","meta","img"):
  244.         ret='<%s%s>%s</%s>'% \
  245.               (self.nodeName,''.join(map(attrfmt,self.attrs)),innerHTML,self.nodeName)
  246.         else:
  247.         ret='<%s%s />'% \
  248.               (self.nodeName,''.join(map(attrfmt,self.attrs)) )
  249.         #assert type(ret)==str, "Stupid automatic conversion"
  250.         return ret
  251.     except:
  252.         if not self.problem:
  253.         print ("stupid ascii detected in %r"%self)
  254.         self.problem.append(self)
  255.         raise
  256.  
  257. class MyHTMLData(MyHTMLNode):
  258.     nodeName=property(lambda self:type(self).__name__)
  259.     def __init__(self,dane):
  260.     MyHTMLNode.__init__(self)
  261.         ret=''
  262.     for c in dane:
  263.         try:
  264.           ret+=c
  265.           #assert type(ret)==str
  266.         except:
  267.           ret+='~~'
  268.     self.dane=ret
  269.     def _HTML(self, indent=0):
  270.     x=self.dane.replace('\n','\n'+'  ') #*indent)
  271.     #if x.startswith('Doda'):
  272.       #print "Doda?",x,type(x)
  273.     return x
  274.  
  275. class MyHTMLComment(MyHTMLData):
  276.     def _HTML(self, indent=0):
  277.     return '<!--%s-->'%self.dane.replace('\n','\n'+'  ') #*indent)
  278.  
  279. class MyHTMLDecl(MyHTMLData):
  280.     def _HTML(self, indent=0):
  281.     return '<!%s>'%self.dane.replace('\n','\n'+'  ') #*indent)
  282.  
  283. class MyHTMLPI(MyHTMLData):
  284.     def _HTML(self, indent=0):
  285.     return '<?%s>'%self.dane.replace('\n','\n'+'  ') #*indent)
  286.  
  287.  
  288. class MyHTMLParse(HTMLParser):
  289.     good1=[
  290.         ('html', {}), ('body', {'onload': 'ImageSwaper.GetInstance().Load(); '}), ('div', {'id': 'page'}), ('div', {'id': 'body'}), ('form', {'action': '/przegladaj_oceny/uczen', 'method': 'POST', 'name': 'PrzegladajOceny'}),
  291.         ('div', {'class': 'container'}), ('div', {'class': 'container-background'}), ('table', {'class': 'decorated stretch'}), ('tr', {'class': 'line0'}), ('td', {})
  292.           ]
  293.     good2=good1[:]
  294.     good2[-2]=('tr',{'class':'line1'})
  295.     autoclose=set(["img","link","meta","br","hr"])
  296.     def __init__(self, typ=0, *args, **arg2):
  297.     self.typ=typ
  298.     HTMLParser.__init__(self,*args,**arg2)
  299.     self.stack=[]
  300.     self.tree=self.curr_elem=MyHTMLElement("document",[])
  301.     self.lastx="line1"
  302.     self.happened=False
  303.  
  304.     def handle_starttag(self, tag, attrs):
  305.     if self.curr_elem.nodeName in self.autoclose: self.handle_endtag(self.curr_elem.nodeName)
  306.     elem=MyHTMLElement(tag,attrs)
  307.     self.curr_elem.appendChild(elem)
  308.     self.curr_elem=elem
  309.     self.happened=True
  310.     flag=(self.typ==0 and self.isok())
  311.     self.stack.append((tag,dict(attrs)))
  312.     if self.typ==0 and self.isok():
  313.         if flag:
  314.         self.fp2.write('","<%s%s>'%
  315.             (tag,''.join(map(lambda x:' %s="%s"'%x,attrs)))
  316.             )
  317.         else:
  318.         if oceny:
  319.             #oceny[-1][-1].pop()
  320.             oceny[-1]+=([],)
  321.         self.fp2.write('","###')
  322.  
  323.     def handle_endtag(self, tag):
  324.     self.happened=True
  325.     flag=self.isok()
  326.         if tag in map(lambda x:x[0],self.stack):
  327.         self.curr_elem=self.curr_elem.parentNode
  328.         x=self.stack.pop()[0]
  329.         while x!=tag:
  330.         #print ("Auto-closing unclosed tag of %s"%x)
  331.         self.curr_elem=self.curr_elem.parentNode
  332.         x=self.stack.pop()[0]
  333.     else:
  334.         pass#print ("Closed unopen tag of %s"%tag)
  335.     if self.typ==0 and flag:
  336.         if self.isok():
  337.         self.fp2.write('","</%s>'%tag)
  338.         else:
  339.         self.fp2.write('"\n"%%%')
  340.  
  341.     def handle_entityref(self, name):
  342.         c = unichr(name2codepoint.get(name,0))
  343.         if c == '\0':
  344.       print "&%s; -> &#x%x;"%(name,ord(c))
  345.         self.handle_data(c,True,name)
  346.  
  347.     def handle_charref(self, name):
  348.         if name.startswith('x'):
  349.             c = unichr(int(name[1:], 16))
  350.         else:
  351.             c = unichr(int(name))
  352.         #print "&#%s; -> &#x%x;"%(name,ord(c))
  353.         self.handle_data(c,True,"#"+name)
  354.  
  355.     def handle_data(self, dane, special=False, ent=None):
  356.     if self.curr_elem.nodeName in self.autoclose: self.handle_endtag(self.curr_elem.nodeName)
  357.     if self.curr_elem.nodeName!="script":
  358.         dane=dane.replace('\n',' ').replace('  ',' ').replace('  ',' ').replace('  ',' ').replace('  ',' ').replace('  ',' ')
  359.     if  True or not special:
  360.         danne=MyHTMLData(dane)
  361.     else:
  362.         danne=MyHTMLData("&%s;"%ent)
  363.     self.curr_elem.appendChild(danne)
  364.     if self.typ==0 and self.isok():
  365.         if self.happened:
  366.         if self.lastx!=self.stack[len(self.good1)-2][1]['class']:
  367.             if oceny:
  368.             oceny[-1]=oceny[-1][:1]+oceny[-1][2:-1]
  369.             oceny.append((dane,[]))
  370.             self.fp2.write('"\n"')
  371.             self.lastx=self.stack[len(self.good1)-2][1]['class']
  372.         else:
  373.             self.fp2.write('","')
  374.         oceny[-1][-1].append('')
  375.         self.happened=False
  376.         if special:
  377.         if ord(dane)==0xa0:
  378.             oceny[-1][-1][-1]+=' '
  379.             self.fp2.write(' ')
  380.         else:
  381.             oceny[-1][-1][-1]+='&#x%x;'%ord(dane)
  382.             self.fp2.write('&#x%x;'%ord(dane))
  383.         else:
  384.         oceny[-1][-1][-1]+=dane
  385.         self.fp2.write(dane)
  386.  
  387.     def handle_decl(self, dane):
  388.     decl=MyHTMLDecl(dane)
  389.     if self.curr_elem.nodeName in self.autoclose: self.handle_endtag(self.curr_elem.nodeName)
  390.     self.curr_elem.appendChild(decl)
  391.  
  392.     def handle_pi(self, dane):
  393.     pi=MyHTMLPI(dane)
  394.     if self.curr_elem.nodeName in self.autoclose: self.handle_endtag(self.curr_elem.nodeName)
  395.     self.curr_elem.appendChild(pi)
  396.  
  397.     def handle_comment(self, comm):
  398.     comment=MyHTMLComment(comm)
  399.     if self.curr_elem.nodeName in self.autoclose: self.handle_endtag(self.curr_elem.nodeName)
  400.     self.curr_elem.appendChild(comment)
  401.  
  402.     def isok(self):
  403.     for i in range(len(self.stack)):
  404.         if i>=len(self.good1):
  405.         return True
  406.         if self.stack[i]==self.good1[i]:
  407.         pass
  408.         elif self.stack[i][0]!=self.good1[i][0]:
  409.         return False
  410.         elif self.stack[i]!=self.good2[i]:
  411.         return False
  412.     else:
  413.         if len(self.stack)==len(self.good1):
  414.         return True
  415.     return False
  416.  
  417. def parse():
  418.     global oceny, oceny_ids
  419.     oceny=[]
  420.     oceny_ids=[]
  421.     parser=MyHTMLParse()
  422.     with open(fn,'rt') as fp, open(os.path.splitext(fn)[0]+".csv",'wb') as parser.fp2:
  423.     parser.fp2.write('"Wyciąg z Librusa')
  424.     buff=fp.read(1024)
  425.     while buff!='':
  426.         buff=buff.replace('> <','><').replace('>\r\n<','><')
  427.         while ord(buff[-1])>127:
  428.           buff+=fp.read(1)
  429.         parser.feed(buff.decode('utf'))
  430.         buff=fp.read(1024)
  431.     parser.fp2.write('"\n')
  432.     #oceny=dict(oceny)
  433.     #oceny: <p class="... ..." ...><a title="WAZNE..." class="..." ...>6+</a></p>
  434.     with open(fn+".html",'wb') as fp:
  435.     x=parser.tree.innerHTML
  436.     x=x.replace('\r\n','\n').replace('\r','\n').replace('\n','\r\n').replace('\n\t\t','\n'+' '*16).replace('\n\t','\n'+' '*8)
  437.     for i in range(40):
  438.       for j in range(2):
  439.         x=x.replace('\n'+' '*i+'\r\n','\n')
  440.     fp.write(x.encode('utf'))
  441.  
  442. def parse3():
  443.     # var chartDataGradeAverangeGraphDiv = [
  444.     parser=MyHTMLParse(1)
  445.     with open(fn,'rt') as fp:
  446.     buff=fp.read(1024)
  447.     while buff!='':
  448.         buff=buff.replace('> <','><').replace('>\r\n<','><')
  449.         while ord(buff[-1])>127:
  450.           buff+=fp.read(1)
  451.         parser.feed(buff.decode('utf'))
  452.         buff=fp.read(1024)
  453.     tree=parser.tree
  454.     txt=tree.childNodes[1].innerHTML
  455.     txt='field='+txt[txt.find('['):txt.find(']')+1]
  456.     d={'columnGradeAverangeGraphDiv':'d','x0':'u','x1':'c','__builtins__':None}
  457.     exec txt in d
  458.     return d['field'] #[{'d':x['d'],'u':d['u'],'c':d['c']} for x in d['field']]
  459.  
  460. def parse2():
  461.     parser=MyHTMLParse(1)
  462.     with open(fn,'rt') as fp:
  463.     buff=fp.read(1024)
  464.     while buff!='':
  465.         buff=buff.replace('> <','><').replace('>\r\n<','><')
  466.         while ord(buff[-1])>127:
  467.           buff+=fp.read(1)
  468.         parser.feed(buff.decode('utf'))
  469.         buff=fp.read(1024)
  470.     #magic_idxes=[2,2,10,3,5,0,3,0,3]
  471.     #magic_nodnams_wzorzec=['html','body','div','div','form','div','div','table','tbody']
  472.     tree=parser.tree
  473.     #magic_nodnams=[]
  474.     #for i,j in zip(magic_idxes,magic_nodnams_wzorzec):
  475.     #magic_nodnams.append(tree.nodeName)
  476.     #try:
  477.       #if i<len(tree.childNodes) and tree.childNodes[i].nodeName==j:
  478.         #tree=tree.childNodes[i]
  479.       #elif i+1<len(tree.childNodes) and tree.childNodes[i+1].nodeName==j:
  480.         #tree=tree.childNodes[i+1]
  481.         #print ('Warn: num for %r is now %r'%(j,i+1) )
  482.       #else:
  483.         #print ('Mistyped num for %r=%r; it\'s instead=%r'%(j,i,tree.childNodes[i] if i<len(tree.childNodes) else Ellipsis) )
  484.         #for isitok,indeks in zip(tree.childNodes, range(len(tree.childNodes)) ):
  485.           #if isitok.nodeName==j:
  486.         #tree=isitok
  487.         #print ('Gut num is %r [%r]'%(indeks,fn) )
  488.         #break
  489.         #else:
  490.           #print ('so far magic_nodnams=%r; librus ma problem z %r'%(magic_nodnams,fn))
  491.     #except:
  492.       #print ('so far magic=%r'%tree)
  493.       #raise
  494.     #print ('magic_nodnams=%r'%magic_nodnams)
  495.     if len(tree.tables)<1:
  496.       print "#err in %s"%fn
  497.       return NotImplemented
  498.     tree = tree.tables[-1].tbody
  499.     #print tree, tree.childNodes
  500.     outree={}
  501.     for i in tree.childNodes:
  502.     if i.nodeName=='tr':
  503.         tdtd=thth=''
  504.         for x in i.childNodes:
  505.         if x.nodeName=='td' and not thth:
  506.             x.nodeName='th'
  507.         if x.nodeName=='th':
  508.             thth=x.innerHTML.strip()
  509.         elif x.nodeName=='td':
  510.             tdtd=x.innerHTML.replace('\n ','\n').replace('\n','').replace('\r','').strip()
  511.         outree[thth]=tdtd
  512.     outree.setdefault('Ocena','BR')
  513.     outree.setdefault('Przedmiot','BRAK')
  514.     outree.setdefault(u'Dodał','BRAK')
  515.     outree.setdefault('Data','1999-11-11')
  516.     if len(outree.get('Ocena',''))>2:
  517.       outree['Komentarz']=outree.setdefault('Komentarz','')+outree['Ocena']
  518.       outree['Ocena']='T'
  519.     if parser.tree.childNodes[0].nodeName!='nauczyciel':
  520.       print "#err brak zapytaj_nauczyciela in %s"%fn
  521.       return NotImplemented
  522.     outree['nauczyciel_id']=int(parser.tree.childNodes[0].innerHTML)
  523.     myfn=fn[:fn.rfind('.')]
  524.     outree['ocena_id']=int(myfn.split('/')[-1])
  525.     try:
  526.       if glob.glob(myfn.replace('oceny_szczegoly','oceny_export/new')+'*') or glob.glob(myfn.replace('oceny_szczegoly','oceny_export/cur')+'*'):
  527.       pass
  528.       else:
  529.       with open(myfn.replace('oceny_szczegoly','oceny_export/new'),'w') as fp82:
  530.           fp82.write('Subject: %s'%safemakeheaderu8('%s: %s'%(outree['Przedmiot'],outree['Ocena'])))
  531.           fp82.write('''
  532. Content-Type: text/html; charset="utf-8"
  533. Content-Transfer-Encoding: quoted-printable
  534. Date: %s
  535. '''%(time.strftime(rfc822fmt, time.strptime(outree['Data'][:outree['Data'].find(' ')],librfmt))))
  536.           # FIXME: nauczyciel_id = id(nauczyciel); id(dodał)=?
  537.           head='%s <%s@%s>'%(safemakeheaderu8(outree['Dodał'.decode('utf')],'"'),outree['nauczyciel_id'],host)
  538.           fp82.write('From: %s'%head)
  539.           fp82.write('''
  540. MIME-Version: 1.0
  541.  
  542. ''')
  543.           x=wrap_HTML(tree.innerHTML.encode('utf')).encode('quoted-printable')
  544.           print (x)
  545.           fp82.write(x)
  546.     except KeyError,e:
  547.       print 'Smutne strasznie ;(',e,myfn,outree
  548.       os.remove(myfn.replace('oceny_szczegoly','oceny_export/new'))
  549.     #oceny[outree['Przedmiot']][0].append(outree)
  550.     return outree
  551.  
  552. def update_graph():
  553.     #href='/uczen/graph_ajax.php?type=wykres_sredniej&classId=37253&userId=918577'
  554.     href='/uczen/graph_ajax.php?type=wykres_sredniej&classId=50832&userId=1261841'
  555.     global fn,url
  556.     oldfn,fn=fn,'graph.html'
  557.     url = site + href
  558.     update()
  559.     print (parse3())
  560.     fn=oldfn
  561.  
  562. def main():
  563.     global url
  564.     jar.set_cookie(cookielib.Cookie(0, 'TestCookie', '1',
  565.             None, False,
  566.             host, True, False,
  567.             '/', False,
  568.             False,
  569.             None,
  570.             False,
  571.             None,
  572.             None,
  573.             {}))
  574.     if os.path.isfile(cookiefn):
  575.     jar.load(ignore_discard=True)
  576.     if not os.path.isfile(fn):
  577.     update()
  578.     parse()
  579.     for an_id in oceny_ids:
  580.     if int(an_id[an_id.rfind('/')+1:])==0: continue
  581.     x=get_details(an_id)
  582.     if x not in baza:
  583.         baza.append(x)
  584.         #with open('bazaocen.py','w') as fp99:
  585.         #fp99.write('baza=%r\n'%baza)
  586.     with open('db/gradonly_auto.sql','w') as fp137:
  587.     mapa=[(entry['ocena_id'],entry['Ocena'],entry['Kategoria'].replace("'","''"),entry['Data'][:10],
  588.   entry['nauczyciel_id'],entry['Przedmiot'],'1' if entry.get('Licz do średniej') else '0',
  589.   entry.get('Waga','1'),dodal(entry)[0],dodal(entry)[1],entry.get('Komentarz','').replace("'","''")) for entry in baza]
  590.     fp137.write((u'''INSERT OR REPLACE INTO oceny (
  591.  ocena_id, ocena, kategoria, data_dodania, nauczyciel, przedmiot, licz_do_sr, waga, dodal, komentarz
  592. ) VALUES (''' + u'),('.join([u'''
  593.  %s, '%s', '%s', '%s', %s, (SELECT przedmiot_id FROM przedmioty WHERE nazwa='%s'), %s, %s, (SELECT uzytkownik_id FROM uzytkownicy WHERE imie='%s' AND nazwisko='%s'), '%s'
  594. '''%x for x in mapa])+
  595. ''');
  596. ''').encode('utf'))
  597.     update_graph()
  598.     with open(os.path.splitext(fn)[0]+".json",'wb') as fp:
  599.     fp.write(repr(oceny).replace(',',',\n')
  600.       .replace('[','[\n ').replace(']','\n]')
  601.       .replace("'",'"').replace("\n ","\n  ")
  602.       .replace('],\n  ','],\n ').replace(']',' ]')
  603.       .replace('{','{\n ').replace('}','\n}')
  604.     )
  605.     jar.save(ignore_discard=True)
  606.  
  607. if __name__=="__main__":
  608.     x=os.path.dirname(sys.argv[0])
  609.     if x: os.chdir(x)
  610.     interact = False
  611.     try:
  612.       main()
  613.     except:
  614.       traceback.print_exc()
  615.       interact = True
  616.     if interact:
  617.       filename = os.environ.get('PYTHONSTARTUP')
  618.       if filename and os.path.isfile(filename):
  619.       with open(filename) as fobj:
  620.           startup_file = fobj.read()
  621.       exec(startup_file)
  622.       code.interact(local=globals())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement