예제 #1
0
파일: views.py 프로젝트: hexuotzo/web2
def login(request):
    next = request.GET.get('next','')
    if request.user.is_authenticated():
        set_session(request)
        return HttpResponseRedirect('../')
    error_info = ""
    if request.POST:
        next = request.POST.get('next')
        user = auth.authenticate(username=request.POST.get('f_user'),
                        password=request.POST.get('f_psw'))       
        if user is not None:
            auth.login(request, user)
            set_session(request)
            try:
                log = "login||"
                log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
                tolog(request,log,log_id)
            except:
                pass
            #这个地方指定登陆成功后跳转的页面
            if next:
                url_next = urllib.quote(next.encode('utf-8'))
                url = '../show_view/?cname=%s'%url_next
                return HttpResponseRedirect(url)
            else:
                return HttpResponseRedirect('../login/')
        else:
            error_info=('用户名或密码错误')
    return render_to_response('index.html', {'error_info': error_info,
                                             'next':next})
예제 #2
0
파일: views.py 프로젝트: hexuotzo/web2
def change_pwd(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('../login/')
    #superuser = request.user.is_superuser
    views = request.session.get('view', {})
    fav = request.session.get('fav', [])
    cname = "密码修改"
    if request.method == "POST":
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            form.save()
            success = "密码修改完成"
            try:
                log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
                log = "change_pwd|"
                tolog(request,log,log_id)
            except:
                pass
            return render_to_response('change_pwd.html', {'success':success,
                                            'form': form,
                                            'cname':cname, 
                                            'views': views, 
                                            'fav':fav,
                                            'version':WEB2_VERSION,
                                            },context_instance=RequestContext(request))
    else:
        form = PasswordChangeForm(request.user)
    return render_to_response('change_pwd.html', {'form': form,
                                            'cname': cname,
                                            'views': views, 
                                            'fav':fav,
                                            'version':WEB2_VERSION,
                                            },context_instance=RequestContext(request))
예제 #3
0
파일: views.py 프로젝트: hexuotzo/web2
def logout(request):
    #log
    try:
        log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
        log = "logout|"
        tolog(request,log,log_id)
    except:
        pass
    auth.logout(request)
    return HttpResponseRedirect('../login/')
예제 #4
0
파일: views.py 프로젝트: hexuotzo/web2
def get_help(request,name):
    if request.method == 'GET':
        cname = "帮助"
        page = "help/%s.html"%name
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            log = "%s|%s"%("get_help",
                           name)
            tolog(request,log,log_id)
        except:
            pass
        return render_to_response(page, locals(), context_instance=RequestContext(request))
    else:
        raise Http404
예제 #5
0
파일: views.py 프로젝트: hexuotzo/web2
def quickly_time(request):
    '''
    快捷选择日期,这个哄幼儿园小朋友的功能并不是我想加的...太2了
    '''
    if request.method == "POST":
        time_name = request.POST.get('type')
        today = datetime.date.today()
        days = datetime.timedelta(1)
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            log = "%s|%s"%("quickly_time",
                           time_name)
            tolog(request,log,log_id)
        except:
            pass
        if time_name == "yesterday" :      #昨天
            begin_time = (today - days).strftime("%Y-%m-%d")
            end_time = (today - days).strftime("%Y-%m-%d")
        elif time_name == "b_week" :         #上上周四至上周三(11年周报改为周3到周2)
            begin_time = (today - datetime.timedelta(days = today.isoweekday() + 11)).strftime("%Y-%m-%d")
            end_time = (today - datetime.timedelta(days = today.isoweekday() + 5)).strftime("%Y-%m-%d")
        elif time_name == "b_month" :        #上月全月
            month_first = datetime.date(today.year,today.month,1) - days
            begin_time = month_first.strftime("%Y-%m-01")
            end_time = month_first.strftime("%Y-%m-%d")
        elif time_name == "this_week" :      #上周四到本周三(11年周报改为周3到周2)
            begin_time = (today - datetime.timedelta(days = today.isoweekday() + 4)).strftime("%Y-%m-%d")
            end_time = (today - datetime.timedelta(days = today.isoweekday() - 2)).strftime("%Y-%m-%d") 
        elif time_name == "this_month" :     #本月截止到昨天
            begin_time = today.strftime("%Y-%m-01")
            end_time = (today - days).strftime("%Y-%m-%d")
        elif time_name == "this_year" :      #今年1月1号至今
            begin_time = today.strftime("%Y-01-01")
            end_time = (today - days).strftime("%Y-%m-%d")
        elif time_name == "this_year" :      #今年1月1号至今
            begin_time = today.strftime("%Y-01-01")
            end_time = (today - days).strftime("%Y-%m-%d")
        else:
            raise Http404
        begin_and_end = "%s;%s"%(begin_time,end_time)
        return HttpResponse(begin_and_end)
    else:
        raise Http404
예제 #6
0
파일: views.py 프로젝트: hexuotzo/web2
def user_fav(request):
    '''
    报表收藏功能
    拿到manytomany对应的报表list
    判断是否在session中,这一部原理同view_search
    '''
    if request.method == 'POST':
        
        views = request.session.get('view', {})
        fav_key = request.POST.get('fav')
        fav_type = request.POST.get('fav_type')
        if fav_key != "":
            v = View.objects.filter(cname = fav_key)
            myfav,create = UserFav.objects.get_or_create(user=request.user)
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            if fav_type == "addfav" :   #收藏
                try:
                    log = "%s|%s"%("addfav",
                                   fav_key.encode("utf-8"))
                    tolog(request,log,log_id)
                except:
                    pass
                for i in v:
                    myfav.fav.add(i)
            elif fav_type == "delfav" :   #取消收藏
                try:
                    log = "%s|%s"%("delfav",
                                   fav_key.encode("utf-8"))
                    tolog(request,log,log_id)
                except:
                    pass
                for i in v:
                    myfav.fav.remove(i) 
        return HttpResponse(fav_type)  
    elif request.method == 'GET' :
        fav_key = request.GET.get('cname')
        myfav,create = UserFav.objects.get_or_create(user=request.user)
        v = View.objects.filter(cname = fav_key)
        for i in v:
            myfav.fav.remove(i) 
        return HttpResponseRedirect('/show_view/')
    raise Http404
예제 #7
0
파일: views.py 프로젝트: hexuotzo/web2
def view_search(request):
    if not request.user.is_authenticated():
        return HttpResponseRedirect('../login/')
    views = request.session.get('view', {})
    fav = request.session.get('fav', [])
    cname = "报表查询" 
    #superuser = request.user.is_superuser
    if request.method == 'POST':
        keyword = request.POST.get('search_key')
        s_views = {}
        for key in views:
            s_views[key]=[]
        for k,v in views.items():
            for name in v:
                if bool(re.search(keyword, name[0], re.IGNORECASE)): #忽略大小写
                    s_views[k].append(name[0])
        tmp_list = []
        view_value = s_views.values()
        map(tmp_list.extend,view_value)
        has_values = len(tmp_list)
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            log = "%s|%s"%("view_search",
                           keyword.encode("utf-8"))
            tolog(request,log,log_id)
        except:
            pass
        return render_to_response('view_search.html',{'views': views,
                                                      'fav':fav,
                                                      'viewname':s_views,
                                                      'cname': cname,
                                                      'has_values':has_values,
                                                      'version':WEB2_VERSION,
                                                      },context_instance=RequestContext(request))
    else:
        raise Http404
예제 #8
0
파일: views.py 프로젝트: hexuotzo/web2
def draw_graph(request):
    """
    execute sql and draw flash.
    """
    if request.method == 'GET':
        t = request.GET.copy()
        tid = int(t['tid'])
        u = Flashurl.objects.get(id=tid)
        url = eval(u.url)
        data={}
        for key,value in url.items():
            if key:
                try:
                    data[key]=value.decode("utf-8")
                except:
                    data[key]=value
        u.delete()
        try:
            user_id = request.user.id
            view_id = data.get('view_id')
            data.pop('view_id')
            v = View.objects.get(id=view_id)
        except:
            raise Http404
        type = data.get('type')
        # default chart type is bar
        if not type:
            type = "bar"
        indicator = data['indicator'].split(",")
        data.pop('indicator')
        x_axis = BAR_FORMAT_FIELD if type == "bar" else DATE_FORMAT_FIELD
        data.pop('type')
        view_obj = ViewObj(v, request)
        u_d = get_user_dimension(user_id,view_id)
        u_dimension = u_d.split(",") + NON_NUMBER_FIELD
        sql = SQLGenerator(data, view_obj, u_d, request,x_axis).get_sql().encode('utf-8')
        res = execute_sql(sql)
        chart = Chart()
        chart.title.text = v.cname
        chart.title.style = "{font-size: 17px; font-family: Verdana; text-align: center;}"
        headers = view_obj.get_headers()
        header_name = [ i['name']['value'] for i in headers]
        header_cname = [ i['cname']['value'] for i in headers]
        # generate x labels
        indexes = []
        label_keys = X_LABELS.get(type, {})
        for name in label_keys:
            try:
                index = header_name.index(name)
            except:
                index = -1
            indexes.append(index)
        is_day_report = True if view_obj.get_body()['time_type']['name'] == 'day' else False
        labels = []
        for line in res:
            label = []
            for i, line_index in enumerate(indexes):
                if line_index >= 0:
                    value = line[line_index]
#                    try:
#                        value = value.encode("utf-8")
#                    except EOFError:
#                        value = str(value)
#                    except:pass
                else:
                    value = ''
                    
                label.append(value)
                
                if i == len(indexes) - 1 and type != "bar":
                    if is_day_report:
                        label.pop()
                        label[-1] = format_date(label[-1])
                    else:
                        end_date = label.pop()
                        begin_date = label.pop()
                        date_list = []
                        if begin_date:
                            date_list.append(format_date(begin_date))
                        if end_date:
                            date_list.append(format_date(end_date))
                        label.append("~".join(date_list))
            labels.append("\n".join(label))
        if labels == ['\n']:labels=['全国\n'.decode("utf-8")]
        chart.x_axis = {'labels': {"labels": labels,"size":12}}
        graph_els = filter(lambda x:x not in u_dimension, header_name)
        els = []
        max_values = []
        # add chart elements one by one.
        if res:
            for i, el in enumerate(graph_els):
                if el not in indicator:
                    index = header_name.index(el)
                    try:
                        values = [int(line[index]) for line in res]
                        max_values.append(max(values))
                    except:
                        values = [line[index] for line in res]
                    graph = Chart()
                    graph.type = type
                    graph.values = values
                    graph.text = header_cname[index]
                    graph.alpha = 0.5
                    graph.fontsize = 13
                    graph.tip = '#key#<br>[#x_label#]:#val#'
                    graph.colour = CHART_COLOR[i]
                    els.append(graph)
        chart.elements = els
        if res:
            max_value = max(max_values)
            step = max_value/10
            chart.y_axis = {'max': max_value, 'min': 0, 'steps': step,'labels': {"size":11}}
        chart_c=chart.create()
        #log
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            data_log = "%s-%s"%(v.cname,v.get_time_type_display())
            log = "%s|%s,%s"%("draw_graph",
                              type.encode("utf-8"),
                              data_log.encode("utf-8"))
            tolog(request,log,log_id)
        except:
            pass
        return HttpResponse(chart_c)
예제 #9
0
파일: views.py 프로젝트: hexuotzo/web2
def show_table(request):
    """
    execute sql and fetch results.
    """
    user_id = request.user.id
    data = request.POST.copy()
    data.pop('timestamp')
    provlist = len(data['provname'].split(",")) if data.has_key('provname') else 0
    try:
        view_id = data.get('view_id')
        data.pop('view_id')
        v = View.objects.get(id=view_id)
    except:
        raise Http404
    # get container div, sent it back to client and put table in that container.
    try:
        page = data['current_page']
        data.pop('current_page')
        page = int(page)
    except:
        page = 1
    container_id = data.get('container')
    data.pop('container')
    view_obj = ViewObj(v, request)
    view_id = view_obj.obj['view_id']
    t = loader.get_template('results.html')
    try:
        v_query = view_obj.get_query()
        v_query = query_session(v_query)
        u_d = get_user_dimension(user_id,view_id)
        #  !!! 生成sql语句
        sql_sum =  SQLGenerator(data, view_obj, u_d,request).get_sum().encode('utf-8')  #求和
        object_sql = SQLGenerator(data, view_obj, u_d,request)
        sql = object_sql.get_sql().encode('utf-8') #查询内容的sql语句
        sql_sum_column = object_sql.sum_column  #求和的字段
        #分页:例 第1页显示 0,30--limit 0,30   第2页显示 30,30 -- limit 30,30
        #所以公式为  (页数-1)*每页显示 , 页数*每页显示
        sql_limit = "%s limit %s,%s"%(sql,(page-1)*MAX_DATA,MAX_DATA+1) #+1多取1条判断是否有下页
        # !!! 双线程执行sql语句,t_sum求和  t_sql取前50条
        t_sum = Mythread(args=(sql_sum,))
        t_sql = Mythread(args=(sql_limit,))
        t_sum.start()
        t_sql.start()
        t_sum.join()
        t_sql.join()
        try:
            sql_column_sum =  t_sum.v
            sum_data = dict(zip(sql_sum_column,sql_column_sum[0])) 
        except:       #某些报表没有指标! 只有维度,跑sql语句会报错的! 擦!
            sum_data = None
        res = t_sql.v
        #分页
        contacts = MyPaginator(len(res), page, MAX_DATA)
        res = res[:MAX_DATA]
        u_dimension = u_d.split(",") if len(u_d)>0 else []
        res = format_table(res, view_obj,u_dimension,sum_data)
        head,res = (res[0],res[1:]) if res else ("",[])
        tips,u_session="",True
        if country_session(u_d) and provlist<HIGHEST_AUTHORITY and v_query:
            tips = "如果要看分省/市数据,请在维度设置中勾选省/市<p>如果查看全国数据,请将省条件全选"
            u_session = False
        
        #log
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            sql_limit_log = "%s|Query_time: %s, sql: %s"%("show_table",
                                                          t_sql.time,
                                                          sql_limit.encode("utf-8"))
            tolog(request,sql_limit_log,log_id)   
            sql_sum_log = "%s|Query_time: %s, sql: %s"%("show_table",
                                                             t_sum.time,
                                                             sql_sum.encode("utf-8"))
            tolog(request,sql_sum_log,log_id)   
        except:
            pass
        html = t.render(Context({'view_id': view_id,
                                'res': res,
                                'contacts': contacts,
                                'u_session': u_session,
                                'tips': tips,
                                'head': head,
                                'ud': u_dimension,
                                'container_id': container_id,
                                'headers': view_obj.get_headers(),
                                'table_name': view_obj.get_body()['dataset'].cname,
                                }))
        json_text = simplejson.dumps({'container':container_id,'content':html})
        return HttpResponse(json_text)
    except:
        json_text = showtable_500(t,container_id,view_obj)
        return HttpResponse(json_text)
예제 #10
0
파일: views.py 프로젝트: hexuotzo/web2
def show_view(request):
    """
    display the corresponding views.
    """
    if not request.user.is_authenticated():
        try:
            cname = request.GET.get('cname')
            url_cname = urllib.quote(cname.encode('utf-8'))
            url = '../login/?next=%s'%url_cname
            return HttpResponseRedirect(url)
        except:
            return HttpResponseRedirect('../login/')
    set_session(request)
    views = request.session.get('view', {})
    areas = request.session.get('area', [])
    fav = request.session.get('fav', [])
    if request.method == 'GET':
        cname = request.GET.get('cname')
        view = View.objects.filter(cname=cname)
        try:
            fav_list = UserFav.objects.get(user=request.user)
            fav_list = [k.cname for k in fav_list.fav.all()]
        except:
            fav_list = []
        is_infav = True if cname in fav_list else False
        if not cname:
            notice = Notice.objects.latest('id')
            f_views = {}
            if fav_list:
                for key in views:
                    f_views[key]=[]
                for k,v in views.items():
                    for name in v:
                        if name[0] in fav_list:
                            f_views[k].append(name[0])
            return render_to_response('view.html', {'version':WEB2_VERSION,
                                                    'notice':notice,
                                                    'views':views,
                                                    'fav':fav, 
                                                    'areas':areas,
                                                    'f_views':f_views,
                                                    'help':"notice",
                                                    }, context_instance=RequestContext(request))                      
        has_permission = view_permission(views, cname)
        if cname and has_permission:
            try:
                help = view[0].dataset.name
                help = help.split("_")[:-2]
                help = "_".join(help)      
            except:
                help = ""
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            if is_infav:
                 #log
                 try:
                     log = "%s|%s"%("usefav",
                                    cname.encode('utf-8'))
                     tolog(request,log,log_id)
                 except:
                     pass
            data = get_view_obj(cname,request)
            date = get_default_date(view)
            view_id = view[0].id
            #log
            try:
                log = "%s|%s"%("show_view",
                               cname.encode('utf-8'))
                tolog(request,log,log_id)
            except:
                print "except le "
                pass
            link_list = get_relation_query(view[0])
            return render_to_response('view.html', {'version':WEB2_VERSION,
                                                    'json': data, 
                                                    'view':view,
                                                    'views':views, 
                                                    'fav':fav,
                                                    'areas':areas,
                                                    'cname':cname,
                                                    'help':help,
                                                    'time':date,
                                                    'is_infav':is_infav,
                                                    'link_list':link_list,
                                                    }, context_instance=RequestContext(request))
    raise Http404
예제 #11
0
파일: views.py 프로젝트: hexuotzo/web2
def down_excel(request):
    """
    download excel file.
    """
    if request.method == 'POST': 
        user_id=request.user.id
        data = request.POST.copy()
        try:
            view_id = data.get('view_id')
            data.pop('view_id')
            v = View.objects.get(id=view_id)
        except:
            raise Http404
        #log
        try:
            log_id = "%s%05d" % (datetime.datetime.now().strftime("%Y%m%d%H%M%S"),random.randint(0,10000))
            data_log = "%s-%s"%(v.cname,v.get_time_type_display())
            log = "%s|%s"%("down_excel",
                           data_log.encode("utf-8"))
            tolog(request,log,log_id)
        except:
            pass
        view_obj = ViewObj(v, request)
        u_d = get_user_dimension(user_id,view_id) 
        sql_sum =  SQLGenerator(data, view_obj, u_d,request).get_sum().encode('utf-8')  #求总量的sql语句
        object_sql = SQLGenerator(data,view_obj,u_d,request)
        sql = object_sql.get_sql().encode('utf-8') #查询内容的sql语句
        sql_sum_column = object_sql.sum_column  #求和的字段
        try:
            sql_column_sum =  execute_sql(sql_sum)
            sum_data = dict(zip(sql_sum_column,sql_column_sum[0]))  
        except:
            sum_data = None      
        res = execute_sql(sql)
        res = format_table(res, view_obj,u_d,sum_data)
        w = Workbook()
        ws = w.add_sheet('result')
        ws.write_merge(0, 0, 0, len(res[0])-1, '%s:%s  (%s ---- %s)'%(v.cname,v.get_time_type_display(),data['begin_date'],data['end_date']))
        if not res:
            response = HttpResponse("",mimetype='application/vnd.ms-excel')
            response['Content-Disposition'] = 'attachment; filename=result.xls'
            return response   
        #write to header
        for k,header in enumerate(res[0]):
            ws.write(1, k, header['cname']['value'])
        res.pop(0)
        #write to data
        for i, line in enumerate(res):
            for j,cell in enumerate(line):
                try:
                    cell['value'] = cell['value'].encode("utf-8")
                except:
                    pass
                if isinstance(cell['value'],str):
                    new_cell = unicode(cell['value'],'utf8')
                else:
                    new_cell = str(cell['value'])
                new_cell=new_cell.replace(",","")
                try:
                    new_cell=int(new_cell)
                except:
                    pass
                ws.write(i+2,j, new_cell)
        w_save = w.save_stream()      
        response = HttpResponse(w_save,mimetype='application/vnd.ms-excel')
        response['Content-Disposition'] = 'attachment; filename=result.xls'
        return response
    else:
        raise Http404