def get_current(cls, namespace, domain, slug, version=None, wrap=True, **kwargs): couch_key = cls._generate_couch_key( namespace=namespace, domain=domain, slug=slug, version=version, reverse=True, **kwargs ) results = cache_core.cached_view(cls.get_db(), cls.indicator_list_view(), cache_expire=60*60*6, reduce=False, include_docs=False, descending=True, **couch_key ) doc = results[0] if results else None if wrap and doc: try: doc_class = to_function(doc.get('value', "%s.%s" % (cls._class_path, cls.__name__))) doc_instance = doc_class.get(doc.get('id')) return doc_instance except Exception as e: logging.error("No matching documents found for indicator %s: %s" % (slug, e)) return None return doc
def get_unknown_form_name(self, xmlns, app_id=None, none_if_not_found=False): if app_id is not None and app_id != '_MISSING_APP_ID': try: app = get_db().get(app_id) except ResourceNotFound: # must have been a weird app id, don't fail hard pass else: for module in app.get('modules', []): for form in module['forms']: if form['xmlns'] == xmlns: return form['name'].values()[0] key = ["xmlns", self.domain, xmlns] results = cache_core.cached_view( get_db(), 'reports_forms/name_by_xmlns', reduce=False, startkey=key, endkey=key + [{}], limit=1, cache_expire=60 ) try: data = list(results)[0] except IndexError: data = None if data: return data['value'] return None if none_if_not_found else "Name Unknown"
def get_results_with_key(self, key, user_id=None, datespan=None, date_group_level=None, reduce=False): view_kwargs = dict() if datespan: view_kwargs.update( startkey=key+datespan.startdate_key_utc, endkey=key+datespan.enddate_key_utc+[{}] ) else: view_kwargs.update( startkey=key, endkey=key+[{}] ) if date_group_level: base_level = 5 if user_id else 4 view_kwargs.update( group=True, group_level=base_level+date_group_level ) else: view_kwargs.update( reduce=reduce ) # Pull Data from the MVP-only DB from mvp_docs.models import IndicatorXForm db = IndicatorXForm.get_db() section = self.couch_view.split('/') couch_view = "%s_indicators/%s" % (section[0], section[1]) return cache_core.cached_view(db, couch_view, cache_expire=60*60*6, **view_kwargs)
def by_domain_and_owner(cls, domain, owner_id, report_slug=None, stale=True, skip=None, limit=None): kwargs = {} if stale: kwargs['stale'] = settings.COUCH_STALE_QUERY if report_slug is not None: key = ["name slug", domain, owner_id, report_slug] else: key = ["name", domain, owner_id] db = cls.get_db() if skip is not None: kwargs['skip'] = skip if limit is not None: kwargs['limit'] = limit result = cache_core.cached_view(db, "reportconfig/configs_by_domain", reduce=False, include_docs=True, startkey=key, endkey=key + [{}], wrapper=cls.wrap, **kwargs) return result
def get_requests(cls, organization, domain=None, user_id=None): key = [organization] if domain: key.append(domain) if user_id: key.append(user_id) # todo - forcing invalidating on all requests while we turn these features on slowly results = cache_core.cached_view( cls.get_db(), "orgs/org_requests", startkey=key, endkey=key + [{}], reduce=False, include_docs=True, wrapper=cls.wrap, ) #return results.all() if not user_id else results.one() if not user_id: return results else: try: length = len(results) if length == 1: return results[0] elif length > 0: raise MultipleResultsFound("OrgRequests found multiple results for %s" % key) except IndexError: return None
def by_domain(cls, domain): return cache_core.cached_view(cls.get_db(), "groupexport/by_domain", key=domain, reduce=False, include_docs=True, wrapper=cls.wrap, )
def get_default_monthly_consumption(domain, product_id, location_type, case_id): """ Return the most specific consumption value for the passed parameters. """ keys = [ [domain, product_id, {}, case_id], [domain, product_id, location_type, None], [domain, product_id, None, None], [domain, None, None, None], ] results = cache_core.cached_view( DefaultConsumption.get_db(), 'consumption/consumption_index', keys=keys, reduce=False, limit=1, ) results = results[0] if results else None if results and results['value']: return Decimal(results['value']) else: return None
def by_domain_and_owner(cls, domain, owner_id, report_slug=None, stale=True, skip=None, limit=None): kwargs = {} if stale: kwargs['stale'] = settings.COUCH_STALE_QUERY pass if report_slug is not None: key = ["name slug", domain, owner_id, report_slug] else: key = ["name", domain, owner_id] db = cls.get_db() if skip is not None: kwargs['skip'] = skip if limit is not None: kwargs['limit'] = limit result = cache_core.cached_view( db, "reportconfig/configs_by_domain", reduce=False, include_docs=True, startkey=key, endkey=key + [{}], wrapper=cls.wrap, **kwargs ) return result
def get_by_name(cls, name, strict=False): if not name: # get_by_name should never be called with name as None (or '', etc) # I fixed the code in such a way that if I raise a ValueError # all tests pass and basic pages load, # but in order not to break anything in the wild, # I'm opting to notify by email if/when this happens # but fall back to the previous behavior of returning None try: raise ValueError('%r is not a valid domain name' % name) except ValueError: if settings.DEBUG: raise else: notify_exception(None, '%r is not a valid domain name' % name) return None extra_args = {'stale': settings.COUCH_STALE_QUERY} if not strict else {} db = cls.get_db() res = cache_core.cached_view(db, "domain/domains", key=name, reduce=False, include_docs=True, wrapper=cls.wrap, force_invalidate=strict, **extra_args) if len(res) > 0: result = res[0] else: result = None if result is None and not strict: # on the off chance this is a brand new domain, try with strict return cls.get_by_name(name, strict=True) return result
def get_by_domain(cls, domain): return cache_core.cached_view(cls.get_db(), "orgs/team_by_domain", key=domain, reduce=False, include_docs=True, wrapper=cls.wrap)
def _get_by_name(cls, name, strict=False): extra_args = { 'stale': settings.COUCH_STALE_QUERY } if not strict else {} db = cls.get_db() res = cache_core.cached_view(db, "domain/domains", key=name, reduce=False, include_docs=True, wrapper=cls.wrap, force_invalidate=strict, **extra_args) if len(res) > 0: result = res[0] else: result = None if result is None and not strict: # on the off chance this is a brand new domain, try with strict return cls.get_by_name(name, strict=True) return result
def get_current(cls, namespace, domain, slug, version=None, wrap=True, **kwargs): couch_key = cls._generate_couch_key(namespace=namespace, domain=domain, slug=slug, version=version, reverse=True, **kwargs) results = cache_core.cached_view(cls.get_db(), cls.indicator_list_view(), cache_expire=60 * 60 * 6, reduce=False, include_docs=False, descending=True, **couch_key) doc = results[0] if results else None if wrap and doc: try: doc_class = to_function( doc.get('value', "%s.%s" % (cls._class_path, cls.__name__))) doc_instance = doc_class.get(doc.get('id')) return doc_instance except Exception as e: logging.error( "No matching documents found for indicator %s: %s" % (slug, e)) return None return doc
def get_results_with_key(self, key, user_id=None, datespan=None, date_group_level=None, reduce=False): view_kwargs = dict() if datespan: view_kwargs.update(startkey=key + datespan.startdate_key_utc, endkey=key + datespan.enddate_key_utc + [{}]) else: view_kwargs.update(startkey=key, endkey=key + [{}]) if date_group_level: base_level = 5 if user_id else 4 view_kwargs.update(group=True, group_level=base_level + date_group_level) else: view_kwargs.update(reduce=reduce) # Pull Data from the MVP-only DB from mvp_docs.models import IndicatorXForm db = IndicatorXForm.get_db() section = self.couch_view.split('/') couch_view = "%s_indicators/%s" % (section[0], section[1]) return cache_core.cached_view(db, couch_view, cache_expire=60 * 60 * 6, **view_kwargs)
def get_requests(cls, organization, domain=None, user_id=None): key = [organization] if domain: key.append(domain) if user_id: key.append(user_id) # todo - forcing invalidating on all requests while we turn these features on slowly results = cache_core.cached_view( cls.get_db(), "orgs/org_requests", startkey=key, endkey=key + [{}], reduce=False, include_docs=True, wrapper=cls.wrap, ) #return results.all() if not user_id else results.one() if not user_id: return results else: try: length = len(results) if length == 1: return results[0] elif length > 0: raise MultipleResultsFound( "OrgRequests found multiple results for %s" % key) except IndexError: return None
def for_domain(cls, domain): res = cache_core.cached_view(cls.get_db(), "by_domain_doc_type_date/view", key=[domain, 'OpenClinicaSettings', None], reduce=False, include_docs=True, wrapper=cls.wrap) return res[0] if len(res) > 0 else None
def view(cls, view_name, wrapper=None, dynamic_properties=None, wrap_doc=True, classes=None, **params): wrapper = wrapper or cls.wrap if dynamic_properties is None and wrap_doc and classes is None: return cache_core.cached_view(cls.get_db(), view_name, wrapper, **params) else: return super(CachedCouchDocumentMixin, cls).view( view_name, wrapper, dynamic_properties, wrap_doc, classes, **params )
def for_domain(cls, domain): res = cache_core.cached_view( cls.get_db(), "by_domain_doc_type_date/view", key=[domain, 'OpenClinicaSettings', None], reduce=False, include_docs=True, wrapper=cls.wrap) return res[0] if len(res) > 0 else None
def get_by_org(cls, org_name): return cache_core.cached_view( cls.get_db(), "orgs/team_by_org_and_name", startkey=[org_name], endkey=[org_name, {}], reduce=False, include_docs=True, wrapper=cls.wrap, )
def for_domain(cls, domain): res = cache_core.cached_view( cls.get_db(), "domain/docs", key=[domain, 'Dhis2Settings', None], reduce=False, include_docs=True, wrapper=cls.wrap) return res[0] if len(res) > 0 else None
def by_domain_and_owner(cls, domain, owner_id, stale=True, **kwargs): if stale: kwargs['stale'] = settings.COUCH_STALE_QUERY key = [domain, owner_id] db = cls.get_db() result = cache_core.cached_view(db, "reportconfig/user_notifications", reduce=False, include_docs=True, startkey=key, endkey=key + [{}], wrapper=cls.wrap, **kwargs) return result
def get_by_organization(cls, organization): result = cache_core.cached_view( cls.get_db(), "domain/by_organization", startkey=[organization], endkey=[organization, {}], reduce=False, include_docs=True, wrapper=cls.wrap ) return result
def _get_view_by_key(cls, key, **kwargs): db = cls.get_db() result = cache_core.cached_view(db, "reportconfig/user_notifications", reduce=False, include_docs=True, startkey=key, endkey=key + [{}], wrapper=cls.wrap, **kwargs) return result
def get_domain_monthly_consumption_data(domain): """ Get all default consumption rows for this domain. """ results = cache_core.cached_view( DefaultConsumption.get_db(), 'consumption/consumption_index', startkey=[domain], endkey=[domain, {}], reduce=False, ) return results
def get_by_name(cls, name, strict=False): extra_args = {'stale': settings.COUCH_STALE_QUERY} if not strict else {} results = cache_core.cached_view(cls.get_db(), "orgs/by_name", key=name, reduce=False, include_docs=True, wrapper=cls.wrap, **extra_args) length = len(results) if length > 1: raise MultipleResultsFound("Error, Organization.get_by_name returned more than 1 result for %s" % name) elif length == 1: return list(results)[0] else: return None
def get_results_with_key(self, key, user_id=None, datespan=None, date_group_level=None, reduce=False): view_kwargs = dict() if datespan: view_kwargs.update(startkey=key + datespan.startdate_key_utc, endkey=key + datespan.enddate_key_utc + [{}]) else: view_kwargs.update(startkey=key, endkey=key + [{}]) if date_group_level: base_level = 5 if user_id else 4 view_kwargs.update(group=True, group_level=base_level + date_group_level) else: view_kwargs.update(reduce=reduce) return cache_core.cached_view(self.get_db(), self.couch_view, cache_expire=60 * 60 * 6, **view_kwargs)
def handle(self, report_slug, *args, **options): kwargs = {'stale': settings.COUCH_STALE_QUERY} key = ["name slug"] result = cache_core.cached_view(ReportConfig.get_db(), "reportconfig/configs_by_domain", reduce=False, include_docs=False, startkey=key, endkey=key + [{}], **kwargs) for report_config in result: domain, owner_id, slug = report_config['key'][1:4] if slug == report_slug: print("%s, %s, %s" % (domain, owner_id, slug))
def get_by_organization(cls, organization): result = cache_core.cached_view(cls.get_db(), "domain/by_organization", startkey=[organization], endkey=[organization, {}], reduce=False, include_docs=True, wrapper=cls.wrap) from corehq.apps.accounting.utils import domain_has_privilege from corehq import privileges result = filter( lambda x: domain_has_privilege(x.name, privileges. CROSS_PROJECT_REPORTS), result) return result
def get_by_organization(cls, organization): result = cache_core.cached_view( cls.get_db(), "domain/by_organization", startkey=[organization], endkey=[organization, {}], reduce=False, include_docs=True, wrapper=cls.wrap ) from corehq.apps.accounting.utils import domain_has_privilege result = filter( lambda x: domain_has_privilege(x.name, privileges.CROSS_PROJECT_REPORTS), result ) return result
def handle(self, report_slug, *args, **options): kwargs = {'stale': settings.COUCH_STALE_QUERY} key = ["name slug"] result = cache_core.cached_view( ReportConfig.get_db(), "reportconfig/configs_by_domain", reduce=False, include_docs=False, startkey=key, endkey=key + [{}], **kwargs) for report_config in result: domain, owner_id, slug = report_config['key'][1:4] if slug == report_slug: print("%s, %s, %s" % ( domain, owner_id, slug ))
def get_default_consumption(domain, product_id, location_type, case_id): keys = [ [domain, product_id, {}, case_id], [domain, product_id, location_type, None], [domain, product_id, None, None], [domain, None, None, None], ] results = cache_core.cached_view(DefaultConsumption.get_db(), 'consumption/consumption_index', keys=keys, reduce=False, limit=1, descending=True, ) results = results[0] if results else None if results and results['value']: return Decimal(float(results['value']) / DAYS_IN_MONTH) else: return None
def set_report_announcements_for_user(request, couch_user): key = ["type", ReportAnnouncement.__name__] now = datetime.utcnow() db = ReportAnnouncement.get_db() data = cache_core.cached_view(db, "announcements/all_announcements", reduce=False, startkey=key + [now.strftime("%Y-%m-%dT%H:00")], endkey=key + [{}], ) announce_ids = [a['id'] for a in data if a['id'] not in couch_user.announcements_seen] for announcement_id in announce_ids: try: announcement = ReportAnnouncement.get(announcement_id) if announcement.show_to_new_users or (announcement.date_created > couch_user.created_on): messages.info(request, announcement.as_html) except Exception as e: logging.error("Could not fetch Report Announcement: %s" % e)
def _get_by_name(cls, name, strict=False): extra_args = {'stale': settings.COUCH_STALE_QUERY} if not strict else {} db = cls.get_db() res = cache_core.cached_view(db, "domain/domains", key=name, reduce=False, include_docs=True, wrapper=cls.wrap, force_invalidate=strict, **extra_args) if len(res) > 0: result = res[0] else: result = None if result is None and not strict: # on the off chance this is a brand new domain, try with strict return cls.get_by_name(name, strict=True) return result
def active_for_user(user, is_active=True): if isinstance(user, AnonymousUser): return [] from corehq.apps.users.models import CouchUser if isinstance(user, CouchUser): couch_user = user else: couch_user = CouchUser.from_django_user(user) if couch_user: domain_names = couch_user.get_domains() return cache_core.cached_view(Domain.get_db(), "domain/by_status", keys=[[is_active, d] for d in domain_names], reduce=False, include_docs=True, wrapper=Domain.wrap ) else: return []
def active_for_user(user, is_active=True): if isinstance(user, AnonymousUser): return [] from corehq.apps.users.models import CouchUser if isinstance(user, CouchUser): couch_user = user else: couch_user = CouchUser.from_django_user(user) if couch_user: domain_names = couch_user.get_domains() return cache_core.cached_view(Domain.get_db(), "domain/by_status", keys=[[is_active, d] for d in domain_names], reduce=False, include_docs=True, wrapper=Domain.wrap) else: return []
def by_domain_and_owner(cls, domain, owner_id, report_slug=None, stale=True, skip=None, limit=None, include_shared=False): kwargs = {} if stale: kwargs['stale'] = settings.COUCH_STALE_QUERY if report_slug is not None: key = ["name slug", domain, owner_id, report_slug] else: key = ["name", domain, owner_id] db = cls.get_db() if skip is not None: kwargs['skip'] = skip if limit is not None: kwargs['limit'] = limit configs = cache_core.cached_view(db, "reportconfig/configs_by_domain", reduce=False, include_docs=True, startkey=key, endkey=key + [{}], wrapper=cls.wrap, **kwargs) if include_shared: user_configs_ids = [c._id for c in configs] shared_configs = [ c for c in cls.shared_on_domain(domain) if c._id not in user_configs_ids ] configs = configs + shared_configs return configs
def get_default_consumption(domain, product_id, location_type, case_id): keys = [ [domain, product_id, {}, case_id], [domain, product_id, location_type, None], [domain, product_id, None, None], [domain, None, None, None], ] results = cache_core.cached_view( DefaultConsumption.get_db(), 'consumption/consumption_index', keys=keys, reduce=False, limit=1, descending=True, ) results = results[0] if results else None if results and results['value']: return Decimal(results['value']) else: return None
def get_by_name(cls, name, strict=False): extra_args = { 'stale': settings.COUCH_STALE_QUERY } if not strict else {} results = cache_core.cached_view(cls.get_db(), "orgs/by_name", key=name, reduce=False, include_docs=True, wrapper=cls.wrap, **extra_args) length = len(results) if length > 1: raise MultipleResultsFound( "Error, Organization.get_by_name returned more than 1 result for %s" % name) elif length == 1: return list(results)[0] else: return None
def get_unknown_form_name(self, xmlns, app_id=None, none_if_not_found=False): key = ["xmlns", self.domain, xmlns] if app_id is not None: key[0] = "xmlns app" key.append(app_id) results = cache_core.cached_view(get_db(), 'reports_forms/name_by_xmlns', reduce=False, startkey=key, endkey=key + [{}], limit=1, cache_expire=60) try: data = list(results)[0] except IndexError: data = None if data: return data['value'] return None if none_if_not_found else "Name Unknown"
def get_notification(cls, username): notifications = cache_core.cached_view( cls.get_db(), "announcements/notifications", reduce=False, startkey=[cls._doc_type, username], endkey=[cls._doc_type, username, {}], include_docs=True, wrapper=cls.wrap) try: if len(notifications) > 1: raise MultipleResultsFound("Multiple results found for announcements.get_notification") notification = notifications[0] except IndexError: notification = None if not notification: notification = cls(user=username) notification.save() return notification
def get_notification(cls, username): notifications = cache_core.cached_view( cls.get_db(), "announcements/notifications", reduce=False, startkey=[cls._doc_type, username], endkey=[cls._doc_type, username, {}], include_docs=True, wrapper=cls.wrap) try: if len(notifications) > 1: for dup_notification in notifications[1:]: # delete the duplicates dup_notification.base_doc += DELETED_SUFFIX dup_notification.save() notification = notifications[0] except IndexError: notification = None if not notification: notification = cls(user=username) notification.save() return notification
def get_results_with_key(self, key, user_id=None, datespan=None, date_group_level=None, reduce=False): view_kwargs = dict() if datespan: view_kwargs.update( startkey=key+datespan.startdate_key_utc, endkey=key+datespan.enddate_key_utc+[{}] ) else: view_kwargs.update( startkey=key, endkey=key+[{}] ) if date_group_level: base_level = 5 if user_id else 4 view_kwargs.update( group=True, group_level=base_level+date_group_level ) else: view_kwargs.update( reduce=reduce ) return cache_core.cached_view(self.get_db(), self.couch_view, cache_expire=60*60*6, **view_kwargs)