Ejemplo n.º 1
0
    def get(self,*args):
        arch = ARCHS.LINUX_RETAIL
        arches = self.request.get('arches')
        if arches :
            arch = sorted([int(_) for _ in arches.split('|')])[-1]
        elif self.request.headers['Host'].split('.')[0] == 'rct':
            arch = ARCHS.LINUX_RCT
        elif self.request.headers['Host'].split('.')[0] == 'sbt':
            arch = ARCHS.LINUX_SBT

        if arch != ARCHS.LINUX_RETAIL:
            user = users.get_current_user()
            if user:
                u = AllowedAccess.get_by_key_name(user.email().lower())
                if user.email().endswith('@s2games.com') or\
                (arch == ARCHS.LINUX_RCT and u and u.rct) or\
                (arch == ARCHS.LINUX_SBT and u and u.sbt):
                    pass
                else:
                    self.response.out.write('gtfo %s' % user.email())
                    return
            else:
                self.redirect(users.create_login_url(self.request.url))
        if self.redirect_latest and args[0] == 'latest':
            versions = get_versions(arch)
            versions.sort(key = lambda x: [int(y) for y in x.split('.')])
            version = versions[-1]
            self.redirect(self.request.url.replace('latest',version).encode('utf8'))
        else:
            try:
                html = memcache.get(self.request.url)
            except:
                html = None
                flush_all()

            if html is None:
                html = self.get_page(arch,*args)
                #try:
                    #html = self.get_page(arch,*args)
                #except:
                    #html = 'Sorry, there was an error processing your request. Most probably hondiff is currently out of quota. App Engine resets all resource measurements at the beginning of each calendar day.'
                    #memcache.set(self.request.url,html,3600)
                try:
                    if html is not None:
                        memcache.set(self.request.url,html)
                except:
                    flush_all()
                    memcache.set(self.request.url,html)
            
            if html is not None:
                if self.content_type != None:
                    self.response.headers['Content-Type'] = self.content_type
                self.response.out.write(html)
Ejemplo n.º 2
0
 def get(self):
     arch = ARCHS.LINUX_RETAIL
     arches = self.request.get('arches')
     if arches :
         arch = sorted([int(_) for _ in arches.split('|')])[-1]
     elif self.request.headers['Host'].split('.')[0] == 'rct':
         arch = ARCHS.LINUX_RCT
     elif self.request.headers['Host'].split('.')[0] == 'sbt':
         arch = ARCHS.LINUX_SBT
     #self.response.out.write('Hello world!')
     versions = get_versions(arch)
     versions.sort(key = lambda x: [int(y) for y in x.split('.')])
     version = versions[-1]
     prevversion = versions[-2]
     template_values = {
         'versions' : get_versions(),
         'latest' : version,
         'previous' : prevversion,
         }
     template = templates.get_template('index.html')        
     self.response.out.write(template.render(template_values))
Ejemplo n.º 3
0
def admin_test(test=None):
  if test and test not in TESTS:
    flask.abort(404)
  form = TestForm()
  if form.validate_on_submit():
    pass

  return flask.render_template(
    'admin/test/test_one.html' if test else 'admin/test/test.html',
    title='Test: %s' % test.title() if test else 'Test',
    html_class='test',
    form=form,
    test=test,
    tests=TESTS,
    versions=versions.get_versions(),
    back_url_for='admin_test' if test else None,
  )
Ejemplo n.º 4
0
def admin_test(test=None):
    if test and test not in TESTS:
        flask.abort(404)
    form = TestForm()
    if form.validate_on_submit():
        pass

    return flask.render_template(
        'admin/test/test_one.html' if test else 'admin/test/test.html',
        title='Test: %s' % test.title() if test else 'Test',
        html_class='test',
        form=form,
        test=test,
        tests=TESTS,
        versions=versions.get_versions(),
        back_url_for='admin_test' if test else None,
    )
Ejemplo n.º 5
0
    def get_page(self,arch,version):
        error = ''
        query = ''
        keywords = ''
        stored_key = self.request.get('stored_query')
        if stored_key:
            try:
                stored = StoredQuery.get(stored_key)
                if not stored:
                    error = 'Sorry, there was no such stored query'
                else:
                    query = stored.query
                    keywords = stored.keywords
            except:
                error = 'Sorry, there was no such stored query'
        else:
            query = self.request.get('query')
            query = urllib.unquote(query)
            keywords = self.request.get('keywords')

        template_values = {
            'query' : query,
            'version' : version,
            }

        query = query.strip()
        data = []

        v = Version.get_by_key_name(version)
        if arch != ARCHS.LINUX_RETAIL:
            return '<pre>Sorry, DB is disabled for RCT/SBT</pre>'
        if v is None or not v.imported:
            versions = get_versions(arch)
            versions.sort(key = lambda x: [int(y) for y in x.split('.')])
            if version == versions[-1]:
                error = "Sorry, this version is not imported into db yet, importing was put into queue"
                taskqueue.add(url='/import',params={'version' : version,'arch' : arch},queue_name='importer')
            else:
                self.redirect('/query/latest/?' + self.request.query_string)
        else:
            if len(query) > 0:
                for qline in query.splitlines():
                    operation = ''
                    if qline[0] == '&':
                        operation = '&'
                        qline = qline[1:]
                    elif qline[0] == '!':
                        operation = '!'
                        qline = qline[1:]
                    try:
                        qline = "Select * from Node where {0}".format(qline)
                        logging.info(qline)
                        q = db.GqlQuery(qline)
                    except:
                        error = 'Sorry this query was malformed'
                        q = None
                    if q is not None:
                        pb = q._proto_query
                        inequalities = {}
                        for k,v in pb.filters().iteritems():
                            #keywords.append(k[0])
                            if k[1] == '!=':
                                inequalities[k[0]] = set([v[1][0]._Literal__value for v in v])
                        #logging.info(inequalities)
                        #for k in pb.orderings():
                            #keywords.append(k[0])
                        if len(pb.orderings()) > 0:
                            error = 'Sorry order by is not allowed'
                        else:

                            try:
                                result = q.fetch(1000)
                                #logging.info('results: {0}'.format(len(result)))
                                _result = []
                                for r in result:
                                    ok = True
                                    for prop,keys in inequalities.iteritems():
                                        l = getattr(r,prop)
                                        if isinstance(l,list):
                                            l = set(l)
                                        else:
                                            l = set([l])
                                        if len(l & keys) > 0:
                                            ok = False
                                            #logging.info('filtered')
                                            #logging.info(l)
                                            break
                                        if not ok: break
                                    if ok:
                                        _result.append(r)
                                result = _result
                                _data = []
                                for node in result:
                                    root = node
                                    while root.parent() is not None:
                                        root = root.parent()
                                    _data.append((root.key().name(),root,node))
                                if operation == '&':
                                    roots = set([x[0] for x in _data])
                                    _data = [x for x in data if x[0] in roots]
                                    data = _data
                                elif operation == '!':
                                    roots = [x[0] for x in _data]
                                    _data = [x for x in data if x[0] not in roots]
                                    data = _data
                                else:
                                    data.extend(_data)

                            except datastore_errors.NeedIndexError, exc:
                                x = str(exc)
                                error = 'Sorry, this query is not possible without additional indices'
Ejemplo n.º 6
0
    def get_page(self,arch,version,hero):
        v = Version.get_by_key_name(version)
        if arch != fetcher.ARCHS.LINUX_RETAIL:
            return '<pre>Sorry, DB is disabled for RCT/SBT</pre>'
        elif v is None or not v.imported:
            versions = get_versions()
            versions.sort(key = lambda x: [int(y) for y in x.split('.')])
            if version == versions[-1]:
                self.response.out.write("Sorry, this version is not imported into db yet, importing was put into queue")
                taskqueue.add(url='/import',params={'version' : version,'arch' : arch},queue_name='importer')
            else:
                self.redirect('/heroes/latest/?' + self.request.query_string)
            return None
        else:
            if hero is None:
                manifest = fetcher.fetch(arch,version,'manifest.xml')
                manifest = Manifest(manifest)
                query = "Select * from Node where tag='hero'".format(version)
                q = db.GqlQuery(query)
                result = q.fetch(1000)
                result = [_ for _ in result if _.name not in ['wl_Warlock']]
                for hero in result:
                    if hasattr(hero,'attackprojectile') and hero.attackprojectile != '':
                        projectile = db.GqlQuery("Select * from Node where name='{0}'".format(hero.attackprojectile)).fetch(1)[0]
                        if hasattr(projectile,'speed'):
                            hero.projectilespeed = projectile.speed
                        else:
                            hero.projectilespeed = '""'
                    else:
                        hero.projectilespeed = '""'

                    #get url for icon
                    icon = hero.icon.replace('.tga','.dds')
                    path = '/'.join(hero.key().name().split('|')[1].split('/')[:-1])
                    path = '/'.join([path,icon])
                    path = path.replace('game/resources0.s2z','game/textures.s2z/00000000')
                    if path in manifest.files:
                        path = '/'.join([manifest.files[path]['version'],path])
                    else:
                        logging.info("Failed to create url for hero icon :( :")
                        logging.info(icon)
                        logging.info(path)
                    hero.iconurl = path
                template_values = {}
                template_values['data'] = result
                template_values['stringtables'] = get_stringtables_entities(arch,version)
                template_name = self.request.get('template')
                if template_name and template_name == 'csv':
                    template = templates.get_template('heroes.csv')        
                else:
                    template = templates.get_template('heroes.html')        
                #self.response.out.write(template.render(template_values))
                #return None
                return template.render(template_values)
            else:
                hero = db.GqlQuery("Select * from Node where tag='hero' and name = :1",hero).fetch(1)
                if len(hero) == 0:
                    return 'Sorry, such hero is not found'
                hero = hero[0]
                #get url for icon
                manifest = fetcher.fetch(arch,version,'manifest.xml')
                manifest = Manifest(manifest)
                icon = hero.icon.replace('.tga','.dds')
                path = '/'.join(hero.key().name().split('|')[1].split('/')[:-1])
                path = '/'.join([path,icon])
                path = path.replace('game/resources0.s2z','game/textures.s2z/00000000')
                path = '/'.join([manifest.files[path]['version'],path])
                hero.iconurl = path
                abilities = db.GqlQuery("Select * from Node where tag='ability' and name in :1",[hero.inventory0,hero.inventory1,hero.inventory2,hero.inventory3]).fetch(10)
                for a in abilities:
                    icon = a.icon.replace('.tga','.dds')
                    path = '/'.join(a.key().name().split('|')[1].split('/')[:-1])
                    path = '/'.join([path,icon])
                    path = path.replace('game/resources0.s2z','game/textures.s2z/00000000')
                    path = '/'.join([manifest.files[path]['version'],path])
                    a.iconurl = path

                #abilities = dict([(a.name,a) for a in abilities])
                template_values = {}
                template_values['entity'] = hero
                template_values['version'] = version
                template_values['abilities'] = abilities
                template_values['stringtables'] = get_stringtables_entities(arch,version)
                template = templates.get_template('hero.html')        
                return template.render(template_values)