Ejemplo n.º 1
0
    def refresh_client(self):
        # https://stackoverflow.com/questions/15974730/how-do-i-get-the-different-parts-of-a-flask-requests-url
        to = request.args.get('to', default=request.url_root, type=str)
        id = request.args.get('id', default=-1, type=int)
        s = self.datamodel.session
        _datamodel = SQLAInterface(Project)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        count, item = _datamodel.query(filters=filters, page_size=1)

        is_found = False
        p = {}
        item = item[0]
        for i in item.projectfiles:
            if i.id == id:
                is_found = True
                p = i
                break

        if is_found and p.status is 0:
            global g
            g['is_logout'][p.name] = 0
            socketio.emit('message', {
                'action': 'refresh',
                'p': ''
            },
                          namespace='/canary',
                          room=p.name)
        return redirect(to)
Ejemplo n.º 2
0
    def heartbeat(self, name=-1):
        me_id = request.args.get(
            'me_id', default='-1',
            type=str)  # me_id means be monitored's line id
        #LineFuncuntionView._heartbeat(name)

        resp = {'is_find': 0, 'is_alive': 0}
        _datamodel = SQLAInterface(ProjectFiles, db.session)
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, name)
        count, item = _datamodel.query(filters=filters,
                                       order_column='id',
                                       order_direction='desc',
                                       page_size=-1)

        if count:
            item = item[0]
            resp['is_alive'] = item.status
            resp['is_find'] = 1

            s = ""
            i = ""
            if me_id in g['status'] and name in g['status'][me_id]:
                if 'status' in g['status'][me_id][name]:
                    s = g['status'][me_id][name]['status']
                elif 'info' in g['status'][me_id][name]:
                    i = g['status'][me_id][name]['info']

            resp['status'] = s
            resp['info'] = i

            if i == "":
                resp['info'] = _('logouting')

        return self.response(200, resp=resp)
Ejemplo n.º 3
0
    def getPeriod(self):
        period = request.args.get('period', default = -1, type = int)
        groupId = request.args.get('groupId', default = -1, type = int) #
        from_time = request.args.get('from_time', default = -1, type = int) #
        to_time = request.args.get('to_time', default = -1, type = int) #
        from_time = int(from_time/1000)
        to_time = int(to_time/1000)

        # check group id is valid
        # get chat with limit
        # return time

        s = self.datamodel.session
        _datamodel = SQLAInterface(Contact)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        filters.add_filter('contact_group_id', FilterEqual, groupId)
        filters.add_filter('updated', FilterGreater, datetime.datetime.fromtimestamp(from_time))
        filters.add_filter('updated', FilterSmaller, datetime.datetime.fromtimestamp(to_time))
        count, item = _datamodel.query(filters=filters, 
                order_column="updated", 
                order_direction="desc",
                page_size=period)

        if count == 0:
            return self.response_400(message="no group found")

        data = {
                'from_time': item[len(item)-1].updated.timestamp(),
                'to_time': item[0].updated.timestamp()
                }

        return self.response(200, data=data)
Ejemplo n.º 4
0
    def list(self):
        name = request.args.get('name', default = '-1', type = str)
        me_id = request.args.get('me_id', default = '-1', type = str) # me_id means be monitored's line id

        s = self.datamodel.session
        _datamodel = SQLAInterface(ProjectFiles)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, name)
        count, item = _datamodel.query(filters=filters, page_size=0)

        base_order = self.base_order
        page_size = self.page_size
        order_columns = self.order_columns;
        formatters_columns = self.formatters_columns

        if count is 0 or ProjectFiles.is_not_active(item[0]):
            name = -1

        if current_user.id != 1:
            filter_user_id = self._base_filters.get_filter_value('user_id')
            if filter_user_id is None or filter_user_id != current_user.id:
                pass

            self._base_filters.clear_filters()
            self._base_filters.add_filter('user_id', FilterEqual, current_user.id)
            self._base_filters.add_filter('projectfiles_name', FilterEqual, name)
            self._base_filters.add_filter('me_id', FilterEqual, me_id)

            self.list_columns = ['name', 'updated']

            self.page_size = -1
            self.base_order = ('updated','desc')
            self.order_columns = ['updated']

        else:
            self._base_filters.clear_filters()
            self.list_columns = ['name', 'me_id', 'projectfiles_name', 'user_id', 'updated']

        if self.__class__.__name__ is 'ContactGroupModelChatView':
            self.formatters_columns = {'updated': lambda x: x.strftime('%p %I:%M').lstrip("0").replace(" 0", "") if x is not None else ""}
            #self.formatters_columns = {'updated': lambda x: dateutil.parser.parse(x).strftime('%p %I:%M').lstrip("0").replace(" 0", "") }
            self.list_columns = ['name', 'id', 'line_id', 'updated', 'icon_base64']

        widgets = self._list()

        if self.__class__.__name__ is 'ContactGroupModelChatView':
            widgets['list'].template = "chat_group.html"

        self.page_size = page_size
        self.base_order = base_order
        self.formatters_columns = formatters_columns
        self.order_columns = order_columns;

        return self.render_template(
            self.list_template, title=self.list_title, widgets=widgets)
Ejemplo n.º 5
0
def get_line_id_by_current_user(s):
    _datamodel = SQLAInterface(Project)
    _datamodel.session = s
    filters = _datamodel.get_filters()
    filters.add_filter('user_id', FilterEqual, current_user.id)
    count, item = _datamodel.query(filters=filters, page_size=1)
    project = item[0]
    line_id = project.name

    return line_id
Ejemplo n.º 6
0
    def update_user(self):
        ## post with json
        #{
        #   "rid": xx,
        #   "action": "update_user",
        #   "user":
        #      {
        #         "name": XX,
        #         "icon_base64":
        #         "me": xx
        if not request.is_json:
            return self.response_400(message="Request payload is not JSON")

        user = request.json.get('user', None)
        rid = request.json.get('rid', None)

        if not user or not rid:
            return self.response_400(message="Missing required parameter")

        s = self.datamodel.session
        _datamodel = SQLAInterface(ProjectFiles)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, str(rid))
        count, item = _datamodel.query(filters=filters, page_size=1)

        if count is 0:
            return self.response_400(message=("Missing required parameter, rid %s" % rid))

        item = item[0]
        item.user_name = user['name']
        item.icon_base64 = user['icon_base64']
        item.me_id = user['me_id']

        _datamodel.add(item)

        message = "warning"

        try:
            s.commit()
            message = "success"
        except IntegrityError as e:
            message = "warning"
            log.warning(LOGMSG_WAR_DBI_ADD_INTEGRITY.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e
        except Exception as e:
            message = str(sys.exc_info()[0]) + "danger"
            log.exception(LOGMSG_ERR_DBI_ADD_GENERIC.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e

        return self.response(200, message=message)
Ejemplo n.º 7
0
    def list(self, pk=-1):
        #self._base_filters = Project.is_used.is_(False)
        s = self.datamodel.session
        _datamodel = SQLAInterface(Project)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        #filters.add_filter('limit_qrcode', FilterGreater, 'current')
        count, item = _datamodel.query(filters=filters, page_size=1)
        if count:
            first_unused = item[0]
            pk = first_unused.id
        else:
            filters = _datamodel.get_filters()
            filters.add_filter('user_id', FilterEqual, None)
            item = _datamodel.query(filters=filters, page_size=1)
            #log.info(item[1][0].__dict__)
            if len(item[1]) is 0:
                pk = -1
            else:
                first_unused = item[1][0]
                pk = first_unused.id
                first_unused.user_id = current_user.id
                _datamodel.edit(first_unused)

        filters = self.datamodel.get_filters()
        filters.add_filter('project_id', FilterEqual, pk)
        count, item = self.datamodel.query(filters=filters, page_size=1)
        if count:
            pk = item[0].id
        else:
            pk = -1
        widgets = self._show(pk)
        widgets['show'].template = "show_line.html"
        show_template = "quickfiles.html"
        return self.render_template(
            show_template,
            pk=pk,
            title=self.show_title,
            widgets=widgets,
            related_views=self._related_views,
        )
Ejemplo n.º 8
0
    def add(self, name=-1):
        self._base_filters.clear_filters()
        self._base_filters.add_filter('name', FilterEqual, name)
        if request.method == 'POST':
            resp = {
                'status': 1,
                'msg': ''
            }
            form = self.add_form.refresh()
            item = self.datamodel.obj()
            form.populate_obj(item)
            item.user_id = current_user.id
            line_id = item.line_id
            self.datamodel.add(item)

            s = self.datamodel.session
            _datamodel = SQLAInterface(Project)
            _datamodel.session = s
            filters = self.datamodel.get_filters()
            filters.add_filter('user_id', FilterEqual, current_user.id)
            count, item = _datamodel.query(filters=filters, page_size=1)
            project = item[0]

            socketio.emit('message', {
                'action': 'add_friend',
                'p': line_id
            },
                          namespace='/canary',
                          room=name)

            widgets = self._list()
            return self.render_template(
                #self.list_template,
                'line_function.html',
                title=self.list_title,
                widgets=widgets,
                resp=resp)

        else:
            widgets = self._add()
            return self.render_template(
                self.add_template,
                widgets=widgets,
            )
Ejemplo n.º 9
0
    def logout(self, name=-1):
        resp = {
            'status': 1,
            'msg': ''
        }
        if request.method == 'POST':
            if name and name != -1:
                line_id = name
            else:
                line_id = get_line_id_by_current_user(self.datamodel.session)
            socketio.emit('message', {
                'action': 'logout',
                'p': ''
            },
                          namespace='/canary',
                          room=name)
            resp = {
                'status': 0,
                'msg': 'logout success'
            }

            _datamodel = SQLAInterface(ProjectFiles, self.datamodel.session)
            filters = _datamodel.get_filters()
            filters.add_filter('name', FilterEqual, name)
            count, item = _datamodel.query(filters=filters)
            for i in item:
                #g['is_logout'][name] = -2
                i.status = -2
                _datamodel.add(i)

                global g
                g['status'][i.me_id][name]['status'] = -1

            #return redirect(self.route_base)

        widgets = self._list()
        return self.render_template('line_function.html',
                                    title=self.list_title,
                                    widgets=widgets,
                                    is_logout=True,
                                    resp=resp)
Ejemplo n.º 10
0
def resp_heartbeat(rid, is_alive, is_socket_emit=True):
    global g
    #print('received my event: ' + str(json) + json['action'])
    _datamodel = SQLAInterface(ProjectFiles, db.session)
    filters = _datamodel.get_filters()
    filters.add_filter('name', FilterEqual, rid)
    count, item = _datamodel.query(filters=filters,
                                   order_column='id',
                                   order_direction='desc',
                                   page_size=-1)
    item = item[0]
    item.status = is_alive
    _datamodel.add(item)

    try:
        db.session.commit()
    except IntegrityError as e:
        db.session.rollback()
        if raise_exception:
            raise e
    except Exception as e:
        db.session.rollback()
        if raise_exception:
            raise e

    if item.status is 1:
        g['is_logout'][rid] = 0

        if is_socket_emit:
            print('emit add friend %s from %s' % (item.description, item.name))
            socketio.emit('message', {
                'action': 'add_friend',
                'p': item.description
            },
                          namespace='/canary',
                          room=item.name)
        else:
            return item.description

    return ""
Ejemplo n.º 11
0
    def sync_group(self):
        name = request.args.get('name', default=-1, type=str)
        s = self.datamodel.session
        _datamodel = SQLAInterface(Project)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        count, item = _datamodel.query(filters=filters, page_size=1)

        if count:
            item = item[0]
            for i in item.projectfiles:
                if i.name == name:
                    socketio.emit('message', {
                        'action': 'sync_group',
                        'p': ''
                    },
                                  namespace='/canary',
                                  room=i.name)
                    return '{"status": "ok"}'

        return '{"status": "error"}'
Ejemplo n.º 12
0
    def list(self, pk=-1):
        #self._base_filters = Project.is_used.is_(False)
        s = self.datamodel.session
        _datamodel = SQLAInterface(Project)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        #filters.add_filter('limit_qrcode', FilterGreater, 'current')
        count, item = _datamodel.query(filters=filters, page_size=1)
        ppk = -1
        if count:
            first_unused = item[0]
            ppk = first_unused.id

        filters = self.datamodel.get_filters()
        filters.add_filter('project_id', FilterEqual, ppk)
        filters.add_filter('id', FilterEqual, pk)
        count, item = self.datamodel.query(filters=filters, page_size=1)
        self.show_columns = ["qrcode"]
        if count:
            pk = item[0].id
            if item[0].status:
                pass
                #self.show_columns = ["add_friend"]
        else:
            pk = -1

        widgets = self._show(pk)
        widgets['show'].template = "show_line.html"

        show_template = "quickfiles.html"
        return self.render_template(
            show_template,
            pk=pk,
            title=self.show_title,
            widgets=widgets,
        )
Ejemplo n.º 13
0
    def update_friend_icon(self):
        ## post with json
        #{
        #   "len":7,
        #   "rid": xx,
        #   "action": "update_friend_icon",
        #   "me_id":,
        #   "friends":
        #      {
        #         "xx":"xx",
        if not request.is_json:
            return self.response_400(message="Request payload is not JSON")

        friends_len = request.json.get('len', None)
        friends = request.json.get('friends', None)
        me_id = request.json.get('me_id', None)
        rid = request.json.get('rid', None)

        if not friends_len or not friends or not rid or not me_id:
            return self.response_400(message="Missing required parameter")

        s = self.datamodel.session
        _datamodel = SQLAInterface(ProjectFiles)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, str(rid))
        count, item = _datamodel.query(filters=filters, page_size=1)

        if count is 0:
            return self.response_400(message=("Missing required parameter, rid %s" % rid))

        uid = item[0].project.user_id

        for k in friends:
            _datamodel = SQLAInterface(Contact)
            _datamodel.session = s
            filters = _datamodel.get_filters()
            filters.add_filter('name', FilterEqual, rid)
            filters.add_filter('from_id', FilterEqual, k)
            filters.add_filter('me_id', FilterEqual, me_id)
            count, item = _datamodel.query(filters=filters, page_size=0)

            id = -1;
            if count:
                item = item[0]
                item.icon_base64 = friends[k]
                _datamodel.add(item)

        message = "warning"

        try:
            s.commit()
            message = "success"
        except IntegrityError as e:
            message = "warning"
            log.warning(LOGMSG_WAR_DBI_ADD_INTEGRITY.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e
        except Exception as e:
            message = str(sys.exc_info()[0]) + "danger"
            log.exception(LOGMSG_ERR_DBI_ADD_GENERIC.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e

        return self.response(200, message=message)
Ejemplo n.º 14
0
    def add(self):
        ## post with json
        if request.is_json:
            name = request.json.get('name', None)
            login_qrcode_base64 = request.json.get('login_qrcode_base64', None)
            description = request.json.get('description', None)

            if name is None or login_qrcode_base64 is None:
                return self.response_400(message="Request payload is not JSON")

            s = self.datamodel.session
            #datamodel = SQLAInterface(Project)
            #datamodel.session = s

            #filters = datamodel.get_filters()
            #filters.add_filter('name', FilterEqual, name)
            #count, item = datamodel.query(filters=filters, page_size=1)
            #if count:
            #    item = item[0]
            #    pid = item.id
            #    datamodel = SQLAInterface(ProjectFiles)
            #    datamodel.session = s
            #    filters = datamodel.get_filters()
            #    filters.add_filter('project_id', FilterEqual, pid)
            #    count, child = datamodel.query(filters=filters, page_size=1)
            #    child = child[0]

            #else:
            #    item = datamodel.obj()
            #    item.name = name
            #    item.created_by_fk = 1
            #    item.changed_by_fk = 1

            #    datamodel.add(item)

            #    pid = item.id

            #    datamodel = SQLAInterface(ProjectFiles)
            #    datamodel.session = s
            #    child = datamodel.obj()

            datamodel = SQLAInterface(ProjectFiles, s)

            filters = datamodel.get_filters()
            filters.add_filter('name', FilterEqual, name)
            count, item = datamodel.query(filters=filters, page_size=1)
            if count:
                child = item[0]
            else:
                child = datamodel.obj()

            child.name = name
            #child.description = description # description now is line_id for user's
            child.login_qrcode_base64 = login_qrcode_base64
            datamodel.add(child)

        else:
            name = request.form.get('name')

            if not name:
                return self.response_400(message="Missing required parameter")

            if 'file' not in request.files:
                flash('No file part')
                return self.response_400(message="Missing file parameter")
            file = request.files['file']

            if file.filename == '':
                return self.response_400(message="no file select")
            #filename = secure_filename(file.filename)
            #file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))

            s = self.datamodel.session
            datamodel = SQLAInterface(Project)
            datamodel.session = s
            item = datamodel.obj()
            item.name = name
            item.created_by_fk = 1
            item.changed_by_fk = 1

            datamodel.add(item)
            pid = item.id

            im = ImageManager()
            filename = im.save_file(file, im.generate_name(file, file))

            datamodel = SQLAInterface(ProjectFiles)
            datamodel.session = s
            child = datamodel.obj()
            child.file = filename
            child.project = item
            child.description = request.form.get('description')
            datamodel.add(child)
        #datamodel._add_files(request, item)
        #log.warning("XX", item.id, "VV")

        return self.response(200, message=datamodel.message)
Ejemplo n.º 15
0
def resp(json):
    global g
    print('== received from js [%s] %s' % (json['action'], str(json)))
    if json['action'] == "heartbeat":
        rid = json['rid']
        is_alive = json['p']['is_alive']
        resp_heartbeat(rid, is_alive)
        #print('received my event: ' + str(json) + json['action'])
        #_datamodel = SQLAInterface(ProjectFiles, db.session)
        #filters = _datamodel.get_filters()
        #rid = json['rid']
        #filters.add_filter('name', FilterEqual, json['rid'])
        #count, item = _datamodel.query(filters=filters, order_column='id', order_direction='desc', page_size=-1)
        #item = item[0]
        #item.status = json['p']['is_alive']
        #_datamodel.add(item)
        #if item.status is 1:
        #    g['is_logout'][rid] = 0

        #    print('emit add friend %s from %s' % (item.description, item.name))
        #    socketio.emit('message', {'action': 'add_friend', 'p': item.description}, namespace='/canary', room=item.name)

    elif json['action'] == "sync_status":
        me_id = json.get('me_id', -1)
        rid = json.get('rid', -1)
        status = json['p'].get('status', "")
        info = json['p'].get('info', "")
        sync_status(me_id, rid, status, info)

        #if me_id not in g['status']:
        #    g['status'][me_id] = {}

        #if me_id in g['status'] and rid != -1:
        #    g['status'][me_id][rid] = {}
        #    g['status'][me_id][rid]['status'] = json['p'].get('status', "")
        #    g['status'][me_id][rid]['info'] = json['p'].get('info', "")

        #if json['p'].get('status', "") == -2:
        #    for i in g['status'].keys():
        #        for j in g['status'][i].keys():
        #            if j is rid:
        #               print('force overwrite')
        #               g['status'][i][rid] = {}
        #               g['status'][i][rid]['status'] = json['p'].get('status', "")
        #               g['status'][i][rid]['info'] = json['p'].get('info', "")
        #               break
    elif json['action'] == "ask_status":
        #print('received my event: ' + str(json) + json['action'])
        _datamodel = SQLAInterface(ProjectFiles, db.session)
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, json['rid'])
        count, item = _datamodel.query(filters=filters,
                                       order_column='id',
                                       order_direction='desc',
                                       page_size=-1)
        item = item[0]
        print("=== current status is %s ===" % (item.status))
        socketio.emit('message', {
            'action': 'resp_status',
            'p': item.status
        },
                      namespace='/canary',
                      room=item.name)
        #if item.status == -2 and json['p'].get('is_ongoing', False):
        #    do_reload(json['rid'])

    elif json['action'] == "reload":
        rid = json['rid']
        if rid not in g['is_logout']:
            g['is_logout'][rid] = 0

        if g['is_logout'][rid] == 0:
            print("trigger reload in %s" % (rid))
            do_reload(json['rid'])
        else:
            print("trigger reload %s count %d" % (rid, g['is_logout'][rid]))

        g['is_logout'][rid] += 1

        #s = platform.system()
        #if s == "Windows":
        #    pythin_bin = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"
        #elif s == "Darwin":
        #    pythin_bin = "/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome"
        #cmd = '"%s" --app chrome-extension://%s/index.html#popou' % (pythin_bin, json['rid'])
        ##print("reload", json, cmd);
        ##msg = check_output(cmd, shell=True).decode()
        ##print("reload", msg);
        #processThread = threading.Thread(target=processLine, args=(cmd,));
        #processThread.start();
        ##time.sleep(5)
        ##msg = check_output(cmd, shell=True).decode()
        ###msg = check_output("%s --app chrome-extension://%s/index.html#popou" % (pythin_bin, json['rid']), shell=True).decode()
        ##print("reload:msg:", msg)
        #print("reload:msg:", msg)
        socketio.emit('message', {
            'action': 'resp_status',
            'p': 0
        },
                      namespace='/canary',
                      room=json['rid'])
Ejemplo n.º 16
0
    def update_group(self):
        ## post with json
        #{
        #   "len":7,
        #   "rid": xx,
        #   "action": "update_group",
        #   "groups":[
        #      {  },
        #      {
        #         "id":"u4ddf1308a8747a3f815cb2959c068ebf",
        #         "name": XX,
        #         "icon_base64":
        #         "me_id":
        if not request.is_json:
            return self.response_400(message="Request payload is not JSON")

        group_len = request.json.get('len', None)
        groups = request.json.get('groups', None)
        rid = request.json.get('rid', None)

        if not group_len or not groups or not rid:
            return self.response_400(message="Missing required parameter")

        s = self.datamodel.session
        _datamodel = SQLAInterface(ProjectFiles)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, str(rid))
        count, item = _datamodel.query(filters=filters, page_size=1)

        if count is 0:
            return self.response_400(message=("Missing required parameter, rid %s" % rid))

        uid = item[0].project.user_id

        for cs in groups:
            if cs.get('id', None) is None:
                log.warning('id not found, current is', cs)
                continue

            _datamodel = SQLAInterface(ContactGroup)
            _datamodel.session = s
            filters = _datamodel.get_filters()
            filters.add_filter('line_id', FilterEqual, cs['id']) # to
            filters.add_filter('projectfiles_name', FilterEqual, rid)
            filters.add_filter('me_id', FilterEqual, cs['me_id'])
            filters.add_filter('user_id', FilterEqual, uid)
            count, item = _datamodel.query(filters=filters, page_size=0)

            id = -1;
            if count:
                group = item[0]
            else:
                group = ContactGroup()
                print("VVV", filters)

            group.line_id = cs['id'] # to
            group.projectfiles_name = rid
            group.user_id = uid
            group.name = cs['name']
            group.icon_base64 = cs['icon_base64']
            group.me_id  = cs['me_id']
            _datamodel.add(group)

        message = "warning"

        try:
            s.commit()
            message = "success"
        except IntegrityError as e:
            message = "warning"
            log.warning(LOGMSG_WAR_DBI_ADD_INTEGRITY.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e
        except Exception as e:
            message = str(sys.exc_info()[0]) + "danger"
            log.exception(LOGMSG_ERR_DBI_ADD_GENERIC.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e

        return self.response(200, message=message)
Ejemplo n.º 17
0
    def add_chats(self):
        ## post with json
        #{
        #   "len":7,
        #   "rid":,
        #   "chat":[
        #      {  },
        #      {  },
        #      {  },
        #      {
        #         "id":"u4ddf1308a8747a3f815cb2959c068ebf",
        #         "me_id": xxx
        #         "icon_base64": xxx,
        #         "title":[
        #            "5/6/2019,周小艾,9:21 PM"
        #         ],
        #         "chat":[
        #            {
        #               "title":"周小艾",
        #               "chat":"五次",
        #               "t":"9:21 PM",
        #               "time":1559740894260
        #               "icon_base64":
        #            },
        if not request.is_json:
            return self.response_400(message="Request payload is not JSON")
        chat_len = request.json.get('len', None)
        chats = request.json.get('chat', None)
        rid = request.json.get('rid', None)

        if not chat_len or not chats or not rid:
            return self.response_400(message="Missing required parameter")

        s = self.datamodel.session

        #_datamodel = SQLAInterface(Project)
        _datamodel = SQLAInterface(ProjectFiles)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('name', FilterEqual, str(rid))
        count, item = _datamodel.query(filters=filters, page_size=1)

        if count is 0:
            return self.response_400(message=("Missing required parameter, rid %s" % rid))

        uid = item[0].project.user_id

        need_commit = 0
        for cs in chats:
            if cs.get('id', None) is None:
                log.warning('id not found, current is', cs)
                continue

            _datamodel = SQLAInterface(ContactGroup)
            _datamodel.session = s
            filters = _datamodel.get_filters()
            filters.add_filter('line_id', FilterEqual, cs['id']) # to
            filters.add_filter('projectfiles_name', FilterEqual, rid)
            filters.add_filter('me_id', FilterEqual, cs['me_id'])
            filters.add_filter('user_id', FilterEqual, uid)
            #count = 0
            count, item = _datamodel.query(filters=filters, page_size=0)
            #item = _datamodel._get_base_query(s.query(_datamodel.obj), filters=filters).first()
            #if item:
            #    item = [item]

            id = -1;
            if count:
                group = item[0]
                id = group.id
            else:
                group = ContactGroup()
                group.line_id = cs['id']
                group.projectfiles_name = rid
                group.name = cs['title']
                group.me_id = cs['me_id']
                group.user_id = uid
                group.icon_base64 = cs.get('icon_base64', cs['chat'][0]['icon_base64'])
                _datamodel.add(group)
                id = group.id

            is_updated = False
            latest_update = None

            for c in cs['chat']:
                _datamodel = SQLAInterface(Contact)
                _datamodel.session = s
                filters = _datamodel.get_filters()
                filters.add_filter('updated', FilterEqual, datetime.datetime.fromtimestamp(int(c['time']) / 1000))
                filters.add_filter('contact_group_id', FilterEqual, id)
                filters.add_filter('line_id', FilterEqual, cs['id']) # to
                filters.add_filter('from_id', FilterEqual, c['from'])
                filters.add_filter('me_id', FilterEqual, cs['me_id']) # could remove?
                #count, item = _datamodel.query(filters=filters, page_size=0)
                #item = _datamodel._get_base_query(s.query(_datamodel.obj), filters=filters).first()
                item = None
                is_found = False

                if c['from_display_name'] == "" or c['icon_base64'] == "":
                    print("no diaplay name and icon base")
                    #print("no diaplay name and icon base", str(c))
                    continue

                #item = _datamodel._get_base_query(s.query(_datamodel.obj), filters=filters).limit(1).first()
                #if item:
                #    item = [item]
                #    is_found = True
                ##if len(item) > 0:
                ##    for i in item:
                ##        if i.contact_group_id == id and i.line_id == cs['id'] and i.from_id == c['from'] and i.me_id == cs['me_id']:
                ##            is_found = True
                ##            item[0] = i
                ##            break

                if is_found:
                    # update 
                    is_dirty = False
                    item = item[0]
                    if item.from_display_name == "" and c['from_display_name'] != "":
                        item.from_display_name = c['from_display_name']
                        is_dirty = True

                    if item.icon_base64 == "" and c['icon_base64'] != "":
                        item.icon_base64 = c['icon_base64']
                        is_dirty = True

                    if is_dirty:
                        need_commit += 1
                        s.add(item)

                else:
                    is_updated = True
                    item = Contact()
                    #d = datetime()
                    #d = datetime.datetime.fromtimestamp
                    item.name = c['title'] 
                    item.msg = c['chat'] 
                    t = int(c['time']) / 1000
                    item.updated = datetime.datetime.fromtimestamp(t)
                    if latest_update:
                        if item.updated > latest_update:
                            latest_update = item.updated 
                    else:
                        latest_update = item.updated

                    item.line_id = cs['id']
                    #item.t = c['t']
                    item.user_id = uid
                    item.contact_group_id = id
                    item.from_display_name = c['from_display_name']
                    item.me_id =  cs['me_id']
                    item.from_id = c['from']
                    item.icon_base64 = c['icon_base64']
                    item.c_type= c.get('type', 1)

                    need_commit += 1
                    s.add(item)

            if is_updated:
                if group.updated is None or latest_update > group.updated:
                    group.updated = latest_update 
                    s.add(group)


        if need_commit is 0:
            return self.response(200, message="no one update")

        message = "warning"
        try:
            s.commit()
            message = "success"
        except IntegrityError as e:
            message = "warning"
            log.warning(LOGMSG_WAR_DBI_ADD_INTEGRITY.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e
        except Exception as e:
            message = str(sys.exc_info()[0]) + "danger"
            log.exception(LOGMSG_ERR_DBI_ADD_GENERIC.format(str(e)))
            s.rollback()
            if raise_exception:
                raise e

        return self.response(200, message=message)
Ejemplo n.º 18
0
    def check_status(self):
        global g
        name = request.args.get('name', default='-1', type=str)
        me_id = request.args.get(
            'me_id', default='-1',
            type=str)  # me_id means be monitored's line id
        icon_base64 = ""

        if name == -1 or me_id == -1:
            return '{"status": "error"}'

        if me_id not in g['status']:
            g['status'][me_id] = {}

        is_found = False
        if name in g['status'][me_id]:
            pass
        else:
            g['status'][me_id][name] = {}

        # direct get me_id in global
        # get new me_id by name
        for m in g['status']:
            if g['status'][m][name]:
                me_id = m
                break

        s = self.datamodel.session
        _datamodel = SQLAInterface(Project)
        _datamodel.session = s
        filters = _datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        count, item = _datamodel.query(filters=filters, page_size=1)
        item = item[0]

        for i in item.projectfiles:
            if i.name == name:
                is_found = True
                icon_base64 = i.icon_base64
                user_name = i.user_name
                #me_id = i.me_id

                if me_id not in g['status']:
                    # change login
                    g['status'][me_id] = {}
                    g['status'][me_id][name] = {}
                break

        if not is_found:
            return '{"status": "error", info: "not found"}'

        if 'status' not in g['status'][me_id][name]:
            g['status'][me_id][name]['status'] = ""

        if 'info' not in g['status'][me_id][name]:
            g['status'][me_id][name]['info'] = ""

        s = g['status'][me_id][name]['status']
        i = g['status'][me_id][name]['info']

        socketio.emit('message', {
            'action': 'status',
            'p': ''
        },
                      namespace='/canary',
                      room=name)

        if not isinstance(s, int):
            s = -3

        stage = int(s)
        if stage is -2:
            i = _('logouting')
        if stage is -1:
            i = _('start line setting syncing')
        elif stage is 0:
            i = _('starting line setting sync ')
        elif stage is 1:
            i = _('start sim chat with line official account')
        elif stage is 2:
            i = _('done for sim chat with line official account')
        elif stage is 3:
            i = _('start delete login message')
        elif stage is 4:
            i = _('done for delete login message')
        elif stage is 5:
            i = _('start add friend')
        elif stage is 6:
            i = _('start get monitor user info')
        elif stage is 7:
            i = _('start syncing history') + " " + i

        return '{"status": %d, "info": "%s", "me_id": "%s", "user_name": "%s", "icon_base64": "%s"}' % \
            (stage, i, me_id, user_name, icon_base64)
Ejemplo n.º 19
0
    def list(self):
        filters = self.datamodel.get_filters()
        filters.add_filter('user_id', FilterEqual, current_user.id)
        count, item = self.datamodel.query(filters=filters, page_size=1)
        ppk = -1
        limit_qrcode = -1
        if count:
            first_unused = item[0]
            ppk = first_unused.id
            limit_qrcode = first_unused.limit_qrcode
        else:
            item = self.datamodel.obj()
            item.created_by_fk = 1
            item.changed_by_fk = 1
            self.datamodel.add(item)
            ppk = item.id
            limit_qrcode = item.limit_qrcode

        _datamodel = SQLAInterface(ProjectFiles, self.datamodel.session)
        filters = _datamodel.get_filters()
        filters.add_filter('project_id', FilterEqual, ppk)
        count, item = _datamodel.query(filters=filters,
                                       order_column='id',
                                       order_direction='desc',
                                       page_size=-1)

        if count < limit_qrcode:
            filters.clear_filters()
            filters.add_filter('project_id', FilterEqual, None)
            _count, item = _datamodel.query(filters=filters, page_size=-1)
            for i in range(count, limit_qrcode):
                j = i - count
                item[j].project_id = ppk
                _datamodel.add(item[j])

        elif count > limit_qrcode:
            for i in range(limit_qrcode, count):
                j = i - limit_qrcode
                item[j].project_id = -1
                _datamodel.add(item[j])

        _datamodel = SQLAInterface(ProjectFiles, self.datamodel.session)
        filters = _datamodel.get_filters()
        filters.add_filter('project_id', FilterEqual, ppk)
        count, item = _datamodel.query(filters=filters,
                                       order_column='id',
                                       order_direction='desc',
                                       page_size=-1)
        for i in item:
            i.status = 0
            _datamodel.add(i)
            if i.name:
                socketio.emit('message', {
                    'action': 'heartbeat',
                    'p': ''
                },
                              namespace='/canary',
                              room=i.name)

        #self._base_filters = Project.is_used.is_(False)
        self._base_filters.clear_filters()
        self._base_filters.add_filter('user_id', FilterEqual, current_user.id)
        widgets = self._list()
        #show_template = "quickfiles.html"
        return self.render_template(
            self.list_template,
            title=self.list_title,
            widgets=widgets,
            #related_views=self._related_views,
        )