def initiate_usage_scheduler(self):

            usage_scheduler_run_time = datetime.datetime.now()
            if self.run_count != 0:
                print 'usage_scheduler started at: ' + str(usage_scheduler_run_time)
                logger.info('usage_scheduler started at: ' + str(usage_scheduler_run_time))
                datasets = bq.get_datasets()
                for dataset in datasets:
                    try:
                        storage_query = "SELECT SUM(size_bytes) as storage_bq FROM [{0}.__TABLES__]".format(
                            dataset['datasetReference']['datasetId'])
                        storage_bq = bq.execute_query(storage_query, user_id=0, tenant='DigInEngine')[0]['storage_bq']
                        user_id = db.get_data(
                            "SELECT user_id FROM digin_user_settings WHERE REPLACE(REPLACE(email, '.', '_'), '@', '_') = '{0}' limit 1".format(
                                dataset['datasetReference']['datasetId']))['rows']
                        if user_id == ():
                            print 'No user_Settings found for user: '******'datasetReference']['datasetId']
                            logger.info('No user_Settings found for user: '******'datasetReference']['datasetId'])
                        else:
                            usages = {'storage_bq': 0 if storage_bq is None else storage_bq}
                            obj = dre.RatingEngine(user_id[0][0], 'undefined', **usages)
                            obj.set_usage()
                            print 'Storage calculated for user ' + str(user_id[0][0])
                            logger.info('Storage calculated for user ' + str(user_id[0][0]))
                    except Exception, err:
                        print err
 def _calculate_summary(self):
     summary = db.get_data("SELECT parameter, value FROM digin_usage_summary "
                           "WHERE user_id = '{0}' AND tenant = '{1}'".format(self.user_id, self.tenant))
     if summary['rows'] == ():
         db.insert_data(self.insert_obj,'digin_usage_summary')
     else:
         update_obj = []
         residue_insert = []
         for i in self.insert_obj:
             for j in summary['rows']:
                 if i['parameter'] == j[0]:
                     if self.is_increment:
                         update_obj.append({i['parameter']:str(int(j[1])+int(i['value']))})
                     else:
                         update_obj.append({i['parameter']: str(int(j[1])-int(i['value']))})
                     break
             else:
                 residue_insert.append({'parameter':i['parameter'],'value':i['value'],'user_id':self.user_id,'tenant':self.tenant})
                 continue
         if update_obj:
             for record in update_obj:
                 db.update_data('digin_usage_summary',"WHERE parameter = '{0}' AND user_id = '{1}' AND tenant = '{2}' "
                                .format(list(record.keys())[0], self.user_id,self.tenant), value = record.itervalues().next(),
                                modifieddatetime=datetime.datetime.now())
         if residue_insert:
             db.insert_data(residue_insert,'digin_usage_summary')
    def get_package_attributes(self):

        package= self.package_id

        query = "SELECT " \
                "package_id, " \
                "package_name, " \
                "package_attribute, " \
                "package_value, " \
                "package_price " \
                "FROM digin_packagedetails " \
                "WHERE package_id = {0} ".format(self.package_id)
        try:
            result = db.get_data(query)['rows']
            data_list = []
            for row in result:
                data = {
                        'package_name': row[1],
                        'package_attribute': row[2],
                        'package_value': row[3],
                        'package_price': row[4]}
                data_list.append(data)
        except Exception, err:
            print err
            return "Error occurred while getting data"
    def get_package_detail(self):
        query = "SELECT " \
                "a.package_id, " \
                "a.package_name, " \
                "a.package_attribute, " \
                "SUM(a.package_value), " \
                "SUM(a.package_price), " \
                "b.expiry_datetime, " \
                "TIMESTAMPDIFF(DAY, CURRENT_TIMESTAMP, expiry_datetime) as remaining_days, " \
                "CURRENT_TIMESTAMP > b.expiry_datetime " \
                "FROM digin_packagedetails a " \
                "INNER JOIN digin_tenant_package_details b " \
                "ON a.package_id = b.package_id " \
                "WHERE b.tenant_id = '{0}' AND b.package_status = 'current_package' " \
                "GROUP BY a.package_id, a.package_name, a.package_attribute, b.expiry_datetime, remaining_days".format(self.tenant)

        try:
            result = db.get_data(query)['rows']
            data_list = []
            for row in result:
                data = {'package_id': row[0],
                        'package_name': row[1],
                        'package_attribute': row[2],
                        'package_value_sum': row[3],
                        'package_price_sum': row[4],
                        'expiry_datetime': row[5],
                        'remaining_days': row[6],
                        'is_expired': bool(row[7])}
                data_list.append(data)
        except Exception, err:
            print err
            return cmg.format_response(False, err, "Error occurred while getting data", exception=sys.exc_info())
def get_user_settings(user_id, domain):

    query = "SELECT components, user_role, cache_lifetime, widget_limit, " \
            "query_limit, logo_path, dp_path, theme_config, modified_date_time, created_date_time, " \
            "domain FROM digin_user_settings WHERE user_id = '{0}' AND domain = '{1}'".format(user_id, domain)
    logo_path = conf.get_conf('FilePathConfig.ini','User Files')['Path']
    document_root = conf.get_conf('FilePathConfig.ini','Document Root')['Path']
    path = re.sub(document_root, '', logo_path)
    try:
        user_data = CC.get_data(query)
        if user_data['rows'] == ():
            logger.info('No user settings saved for given user ' + user_id)
            return cmg.format_response(True,user_id,"No user settings saved for given user and domain")
        data ={
             'components': user_data['rows'][0][0],
             'user_role': user_data['rows'][0][1],
             'cache_lifetime': int(user_data['rows'][0][2]),
             'widget_limit': int(user_data['rows'][0][3]),
             'query_limit': int(user_data['rows'][0][4]),
             'logo_path': path+user_data['rows'][0][5],
             'dp_path': path+user_data['rows'][0][6],
             'theme_config': user_data['rows'][0][7],
             'modified_date_time': user_data['rows'][0][8],
             'created_date_time': user_data['rows'][0][9],
             'domain': user_data['rows'][0][10]
             }

    except Exception, err:
        logger.error("Error retrieving user settings")
        logger.error(err)
        print "Error retrieving user settings"
        print err
        raise
 def get_rating_summary(self):
     user_dict = {}
     if self.security_level == 'admin':
         summary = db.get_data("SELECT user_id, parameter, SUM(value) as value FROM digin_usage_summary "
                               "WHERE tenant = '{0}' GROUP BY user_id, parameter".format(self.tenant))['rows']
     else:
         summary = db.get_data("SELECT user_id, parameter, value FROM digin_usage_summary "
                           "WHERE user_id = '{0}' AND tenant = '{1}'".format(self.user_id, self.tenant))['rows']
     for parameter in summary:
         if parameter[0] in user_dict:
             user_dict[parameter[0]][parameter[1]]=parameter[2]
         else:
             user_dict[parameter[0]] = {parameter[1]:parameter[2]}
     rated_dict = {'usage': [{self.tenant:user_dict}],
                   'exceed_blocked': euc.ExceedUsageCalculator(tenant=self.tenant, attribute=None).calculation()}
     return cmg.format_response('True',rated_dict,"Usage data retrieved")
def wcloud_stream(tweet):
    try:
        logger.info('Getting data from Cache if there is')
        c_data = json.loads(cache.get_data('wordcloud','d_name,data','d_name ="test1"').data)
        logger.info('calc word count for a new tweet')
        dat = wnc.wordcloud_json(tweet)
        n = json.loads(dat)

        logger.info('Agreegate previous and current tweets')
        for t in n:
            if t in c_data:
                c_data[t] = c_data[t] + n[t]
            else:
                c_data.update({t:n[t]})

        logger.info('update MemSql')
        c_data=dict(sorted(c_data.items(), key=lambda x: x[1],reverse=True)[:250])
        update_data(json.dumps(c_data))

    except Exception, err:
        logger.info(err, 'Insert to MemSQL, if dash boardname is ot existing')
        dat = wnc.wordcloud_json(tweet)
        c_data = json.loads(dat)
        c_data=dict(sorted(c_data.items(), key=lambda x: x[1],reverse=True)[:250])
        insert_data(json.dumps(c_data))
def ret_fuzzyC(dbtype, rec_data, u_id, cache_timeout):
    time = datetime.datetime.now()
    try:
        cache_existance = CC.get_data("SELECT expirydatetime >= '{0}' FROM cache_algorithms "
                                      "WHERE id = '{1}' and name_algo='fuzzyC'".format(time, u_id))['rows']

    except Exception, err:
        logger.error(err, "Error connecting to cache..")
        cache_existance = ()
 def get_usage(self):
     if self.attribute == "data":
         try:
             summary = db.get_data(" SELECT sum(value) FROM digin_usage_summary "
                                   " WHERE tenant = '{0}' AND parameter = 'download_bq' OR 'upload_size_bq' ".format(self.tenant))['rows']
             return summary[0]
         except Exception, err:
             print "Error inserting to DB!"
             return cmg.format_response(False, err, "Error occurred while getting packages details .. \n" + str(err),
                                           exception=sys.exc_info())
    def get_rating_detail(self, params):

        date_dict = {}
        if self.security_level == 'admin':
            detail = db.get_data("SELECT user_id, DATE(createddatetime), parameter, SUM(value) as value FROM digin_usage_details "
                                  "WHERE tenant = '{0}' AND DATE(createddatetime)>= {1} AND DATE(createddatetime)<= {2} "
                                  "GROUP BY user_id, DATE(createddatetime), parameter".format(self.tenant, params.start_date, params.end_date))['rows']
        else:
            detail = db.get_data("SELECT user_id, DATE(createddatetime), parameter, SUM(value) as value FROM digin_usage_details "
                                  "WHERE user_id = '{0}' AND tenant = '{1}' AND DATE(createddatetime)>= {2} AND DATE(createddatetime)<= {3} "
                                  "GROUP BY user_id, DATE(createddatetime), parameter".format(self.user_id, self.tenant, params.start_date, params.end_date))['rows']
        
        for row in detail:
            if row[0] in date_dict:
                if str(row[1]) in date_dict[row[0]]:
                    date_dict[row[0]][str(row[1])][row[2]] = row[3]
                else:
                    date_dict[row[0]][str(row[1])] = {row[2]:row[3]}
            else:
                date_dict[row[0]] = {str(row[1]):{row[2]:row[3]}}

        rated_detail = [{self.tenant:date_dict}]
        return cmg.format_response('True',rated_detail,"Usage data retrieved")
def _temporary_delete_components(comp_id, table, user_id, domain):
        try:
            is_access_valid = CC.get_data("SELECT digin_comp_id FROM digin_component_header a INNER JOIN "
                                          "digin_component_access_details b ON a.digin_comp_id = b.component_id "
                                          "WHERE digin_comp_id = {0} AND domain = '{1}' AND user_id = '{2}'".format(comp_id,domain,user_id))
            if int(is_access_valid['rows'][0][0]) == int(comp_id):
                result = CC.update_data(table,'WHERE digin_comp_id = {0}'.format(comp_id),is_active=False)
                _rate_calculation_helper(False, comp_id, 'dashboard', user_id, domain) # Component count is decremented when components moved to Trash
                print 'Component deleted user_id: {0}, tenant: {1}, component_id: {2}'.format(user_id, domain, comp_id)
            else:
                result = 'No component found for deletion user_id: {0}, tenant: {1}, component_id: {2}'.format(user_id,domain,comp_id)
                print result
                return result
        except Exception, err:
            print err
            raise
    def get_ledger(self):
        # query = "SELECT " \
        #         "a.package_id, " \
        #         "a.package_name, " \
        #         "a.package_attribute, " \
        #         "a.package_value, " \
        #         "a.package_price, " \
        #         "b.expiry_datetime, " \
        #         "TIMESTAMPDIFF(DAY, CURRENT_TIMESTAMP, expiry_datetime) as remaining_days, " \
        #         "b.package_status, " \
        #         "b.created_datetime " \
        #         "FROM digin_packagedetails a " \
        #         "INNER JOIN digin_tenant_package_details b " \
        #         "ON a.package_id = b.package_id " \
        #         "WHERE b.tenant_id = '{0}' " \
        #         "AND b.created_datetime >= TIMESTAMP('{1}') AND  b.created_datetime <= TIMESTAMP('{2}') " \
        #         "GROUP BY a.package_id, a.package_name, a.package_attribute, b.expiry_datetime, remaining_days " \
        #         "ORDER BY b.created_datetime ".format(self.tenant, self.start_date, self.end_date)

        query = "SELECT " \
                "package_id, " \
                "expiry_datetime, " \
                "TIMESTAMPDIFF(DAY, CURRENT_TIMESTAMP, expiry_datetime) as remaining_days, " \
                "package_status, " \
                "created_datetime " \
                "FROM digin_tenant_package_details  " \
                "WHERE tenant_id = '{0}' " \
                "AND created_datetime >= TIMESTAMP('{1}') AND  created_datetime <= TIMESTAMP('{2}') " \
                "ORDER BY created_datetime ".format(self.tenant, self.start_date, self.end_date)


        try:
            result = db.get_data(query)['rows']
            data_list = []
            for row in result:
                data = {'package_id': row[0],
                        'package_Details': PackageProcessor(package_name=None, package_attribute=None, package_value=None, package_price=None,is_default=False, tenant =self.tenant,package_id=int(row[0])).get_package_attributes(),
                        'expiry_datetime': row[1],
                        'remaining_days': row[2],
                        'package_status': row[3],
                        'created_datetime': row[4]}
                data_list.append(data)
        except Exception, err:
            print err
            return cmg.format_response(False, err, "Error occurred while getting data", exception=sys.exc_info())
def get_all_components(params, user_id, domain):
      try:
        data = CC.get_data("SELECT h.digin_comp_id, h.digin_comp_name, h.digin_comp_type "
                           "FROM digin_component_access_details a "
                           "INNER JOIN digin_component_header h "
                           "ON a.component_id = h.digin_comp_id "
                           "WHERE h.is_active = TRUE AND a.domain = '{0}' AND a.user_id = '{1}' "
                           "AND a.type IN ('dashboard','report')".format(domain, user_id))
        print data["rows"]
        comps = []
        for comp in data["rows"]:
            comp_dict ={}
            comp_dict["compID"]= comp[0]
            comp_dict["compName"]=comp[1]
            comp_dict["compType"]=comp[2]
            comps.append(comp_dict)
        return cmg.format_response(True,comps,"Successful!")

      except Exception, err:
        logger.error("Error getting data from cache. %s" % err)
        return cmg.format_response(False,0,"Error Occurred!", exception = sys.exc_info())
    def get_package_summary(self):
        query = "SELECT " \
                "a.package_attribute, " \
                "SUM(a.package_value), " \
                "SUM(a.package_price) " \
                "FROM digin_packagedetails a " \
                "INNER JOIN digin_tenant_package_details b " \
                "ON a.package_id = b.package_id " \
                "WHERE b.tenant_id = '{0}' AND b.package_status = 'current_package' " \
                "GROUP BY a.package_attribute".format(self.tenant)

        try:
            result = db.get_data(query)['rows']
            data_list = []
            for row in result:
                data = {'package_attribute': row[0],
                        'package_value_sum': row[1],
                        'package_price_sum': row[2]}
                data_list.append(data)
        except Exception, err:
            print err
            return cmg.format_response(False, err, "Error occurred while getting data", exception=sys.exc_info())
def store_user_settings(params,user_id, domain):

    data_object = [{'user_id': user_id,
             'email': params['email'],
             'components': params['components'],
             'user_role': params['user_role'],
             'cache_lifetime': 300 if params['cache_lifetime'] is None else int(params['cache_lifetime']),
             'widget_limit': default_user_settings['widget_limit'] if params['widget_limit'] is None else int(params['widget_limit']),
             'query_limit': default_user_settings['query_limit'] if params['query_limit'] is None else int(params['query_limit']),
             'logo_path': '/digin_user_data/'+user_id+'/'+domain+'/logos/'+params['logo_name'],
             'dp_path': '/digin_user_data/'+user_id+'/'+domain+'/DPs/'+params['dp_name'],
             'theme_config': params['theme_config'],
             'modified_date_time': datetime.datetime.now(),
             'created_date_time': datetime.datetime.now(),
             'domain': domain
             }]
    logger.info("Data received!")
    logger.info(data_object)
    existance = CC.get_data("SELECT user_id from digin_user_settings where user_id = '{0}' AND domain = '{1}'".format(user_id, domain))
    if existance['rows'] != ():
        try:
            CC.update_data('digin_user_settings',"WHERE user_id='{0}'".format(user_id),
                           components=params['components'],
                           user_role=params['user_role'],
                           cache_lifetime=int(params['cache_lifetime']),
                           widget_limit=int(params['widget_limit']),
                           query_limit=int(params['query_limit']),
                           logo_path='/digin_user_data/'+user_id+'/'+domain+'/logos/'+params['logo_name'],
                           dp_path='/digin_user_data/'+user_id+'/'+domain+'/DPs/'+params['dp_name'],
                           theme_config=params['theme_config'],
                           modified_date_time=datetime.datetime.now())
            return cmg.format_response(True,1,"User settings updated successfully")
        except Exception, err:
            logger.error("Error updating user settings")
            logger.error(err)
            print "Error updating user settings"
            print err
            raise
def get_component_by_comp_id(params, user_id, domain):
      try:
        data = CC.get_data("SELECT h.digin_comp_id, h.digin_comp_name, h.refresh_interval, h.digin_comp_class, "
                           "h.digin_comp_type, h.digin_comp_category, h.created_date_time, p.page_id, p.page_name, "
                           "p.page_data, d.widget_id, d.widget_name, d.widget_data,d.row,d.col,d.size_x,d.size_y "
                            "FROM "
                            "(SELECT component_id FROM digin_component_access_details WHERE "
                            "component_id = {0} AND domain = '{1}' AND user_id = '{2}') a "
                            "LEFT JOIN "
                            "(SELECT digin_comp_id, digin_comp_name, refresh_interval, digin_comp_class, "
                            "digin_comp_type, digin_comp_category, created_date_time "
                            "FROM digin_component_header "
                            "WHERE is_active = TRUE AND digin_comp_id = {0}) h "
                            "ON a.component_id = h.digin_comp_id "
                            "LEFT JOIN "
                            "(SELECT page_id, page_name, page_data, digin_comp_id  FROM digin_component_page_detail "
                            "WHERE is_active = TRUE) p "
                            "ON h.digin_comp_id = p.digin_comp_id "
                            "LEFT JOIN "
                            "(SELECT widget_id, widget_name, widget_data,size_x,size_y,col,row, digin_comp_id, comp_page_id  FROM digin_component_detail "
                           "WHERE is_active = TRUE) d "
                           "ON h.digin_comp_id = d.digin_comp_id AND p.page_id = d.comp_page_id "
                           "ORDER BY d.widget_id ASC".format(params.comp_id, domain, user_id))

        if data['rows'] == ():
            print "No dashboard saved for given ID!"
            return cmg.format_response(True,None,"No dashboard saved for given ID!")
        component = {}
        component['compID'] = data['rows'][0][0]
        component['compName'] = data['rows'][0][1]
        component['compClass'] = data['rows'][0][3]
        component['compType'] = data['rows'][0][4]
        component['compCategory'] = data['rows'][0][5]
        component['refreshInterval'] = data['rows'][0][2]

        def json_encode_decimal(obj):
            if isinstance(obj, decimal.Decimal):
                return str(obj)
            raise TypeError(repr(obj) + " is not JSON serializable")

        widget_ids = set(d[10] for d in data['rows'])
        widgets = []
        #filter(None, widget_ids[0])
        for widget_id in widget_ids:
            if widget_id is None:
                continue
            for record in data['rows']:
                if widget_id == record[10]:
                    widget = {
                        'pageID':record[7],
                        'widgetID' : record[10],
                        'sizeX':record[15],
                        'sizeY':record[16],
                        'row':record[13],
                        'col':record[14],
                        'widgetName':record[11],
                        'widgetData':json.loads(record[12]) if record[12] is not None else None
                    }
                    widgets.append(widget)

        pages = []
        page_ids = set( d[7] for d in data['rows'])
        for page_id in page_ids:
            for record in data['rows']:
                if page_id == record[7]:
                    page ={
                        'pageID': record[7],
                        'pageName': record[8],
                        'pageData': json.loads(record[9]) if record[9] is not None else None,
                        'widgets': []
                    }
                    pages.append(page)
                    break

        pages_sorted = sorted(pages, key=itemgetter('pageID'))
        widgets_sorted = sorted(widgets, key=itemgetter('widgetID'))
        for page in pages_sorted:
            for widget_ in widgets_sorted:
                if widget_['pageID'] == page['pageID']:
                    #widget_.pop("pageID", None)
                    page['widgets'].append(widget_)

        component['pages'] = pages_sorted

        return cmg.format_response(True,component,"Successful!")

      except Exception, err:
        logger.error("Error getting data from cache. %s" % err)
        return cmg.format_response(False,0,"Error Occurred!", exception = sys.exc_info())
                                      'type':'dashboard',
                                      'domain':domain}
                access_detail_obj.append(access_detail_comp)
            result_ad = CC.insert_data(access_detail_obj,'digin_component_access_details')
            print result_ad
        except Exception, err:
            print err
            return cmg.format_response(False,err,"Error Occurred while giving default dashboard access",exception=sys.exc_info())
    #TODO insert menuids to access_details based on user's package
    if ast.literal_eval(default_sys_settings['signup_sample_reports']):
        logger.info("User will be given the default report access!")
        print "User will be given the default report access!"
        query = "SELECT  digin_comp_name " \
                "FROM digin_component_header WHERE digin_comp_id in {0} ".format(tuple(ast.literal_eval(default_user_settings['components_reports'])))
        print query
        user_data = CC.get_data(query)
        report_names = user_data['rows']

        try:
            access_detail_obj = []
            prs.ReportInitialConfig.prptConfig(user_id,domain,report_names)
            prs.ReportInitialConfig.ktrConfig(user_id,domain,report_names)
            for reports in ast.literal_eval(default_user_settings['components_reports']):
                access_detail_comp = {'user_id':user_id,
                                      'component_id':reports,
                                      'type':'report',
                                      'domain':domain}
                access_detail_obj.append(access_detail_comp)
            result_ad = CC.insert_data(access_detail_obj,'digin_component_access_details')
            print result_ad
        except Exception, err:
    def get_usage(self):
        if self.attribute == "data":
            try:
                summary = db.get_data(" SELECT sum(value) FROM digin_usage_summary "
                                      " WHERE tenant = '{0}' AND parameter = 'download_bq' OR 'upload_size_bq' ".format(self.tenant))['rows']
                return summary[0]
            except Exception, err:
                print "Error inserting to DB!"
                return cmg.format_response(False, err, "Error occurred while getting packages details .. \n" + str(err),
                                              exception=sys.exc_info())

        elif self.attribute == "storage":
            try:
                summary = db.get_data(" SELECT sum(value) FROM digin_usage_summary "
                                      " WHERE tenant = '{0}' AND parameter = 'storage_bq' ".format(self.tenant))['rows']
                return summary[0]
            except Exception, err:
                print "Error inserting to DB!"
                return cmg.format_response(False, err, "Error occurred while getting packages details .. \n" + str(err),
                                              exception=sys.exc_info())

        elif self.attribute == "users":
            try:
                summary = db.get_data(" SELECT sum(value) FROM digin_usage_summary "
                                      " WHERE tenant = '{0}' AND parameter = 'users' ".format(self.tenant))['rows']
                return summary[0]
            except Exception, err:
                print "Error inserting to DB!"
                return cmg.format_response(False, err, "Error occurred while getting packages details .. \n" + str(err),
                                              exception=sys.exc_info())
        df = ret_data(dbtype, rec_data)
        print 'dbtype', dbtype
        print 'rec_data', rec_data

        try:
            output = fc.FuzzyC_algo(df)
            cache_data(output, u_id, cache_timeout, name_algo='fuzzyC')
            result = cmg.format_response(True,output,'fuzzyC processed successfully!')

        except Exception, err:
            logger.error(err)
            result = cmg.format_response(False,err,'fuzzyC Failed!', sys.exc_info())

        finally:
            return result

    else:
        logger.info("Getting fuzzyC data from Cache..")
        result = ''
        try:
            data = json.loads(CC.get_data("SELECT data FROM cache_algorithms "
                                          "WHERE id = '{0}' and name_algo='fuzzyC'".format(u_id))['rows'][0][0])
            result = cmg.format_response(True,data,'Data successfully processed!')
            logger.info("Data received from cache")
        except:
            logger.error("Error occurred while fetching data from Cache")
            result = cmg.format_response(False,None,'Error occurred while getting data from cache!',sys.exc_info())
            raise
        finally:
            return result