def get_ols_url(): req = ThreadLocal.get_current_request() protocol = req.META['wsgi.url_scheme'] r = req.build_absolute_uri() ols_url = protocol + '://' + ThreadLocal.get_current_request().META['HTTP_HOST'] + reverse( 'copo:ajax_search_ontology') return ols_url
def get_permalink(self): """ return a permalink. Use page slug/name/title or nothing as additional text. """ if self.pk in self._permalink_cache: #print "PageMeta permalink_cache len: %s, pk: %s" % (len(self._permalink_cache), self.pk) return self._permalink_cache[self.pk] # Get the system preferences request = ThreadLocal.get_current_request() sys_pref = request.PYLUCID.preferences sys_pref_form = request.PYLUCID.preferences_form use_additions = sys_pref.get("permalink_additions", sys_pref_form.PERMALINK_USE_TITLE) do_slugify = False if use_additions == sys_pref_form.PERMALINK_USE_TITLE: # Append the PageMeta title (language dependent) addition_txt = self.get_title() do_slugify = True elif use_additions == sys_pref_form.PERMALINK_USE_NAME: addition_txt = self.get_name() do_slugify = True elif use_additions == sys_pref_form.PERMALINK_USE_SLUG: addition_txt = self.pagetree.slug else: addition_txt = "" if do_slugify: addition_txt = slugify(addition_txt) url = reverse('PyLucid-permalink', kwargs={'page_id': self.pagetree.id, 'url_rest': addition_txt}) self._permalink_cache[self.pk] = url return url
def get_permalink(self): """ return a permalink. Use page slug/name/title or nothing as additional text. """ # Get the system preferences request = ThreadLocal.get_current_request() sys_pref = request.PYLUCID.preferences sys_pref_form = request.PYLUCID.preferences_form use_additions = sys_pref.get("permalink_additions", sys_pref_form.PERMALINK_USE_TITLE) do_slugify = False if use_additions == sys_pref_form.PERMALINK_USE_TITLE: # Append the PageMeta title (language dependent) addition_txt = self.get_title() do_slugify = True elif use_additions == sys_pref_form.PERMALINK_USE_NAME: addition_txt = self.get_name() do_slugify = True elif use_additions == sys_pref_form.PERMALINK_USE_SLUG: addition_txt = self.pagetree.slug else: addition_txt = "" if do_slugify: addition_txt = slugify(addition_txt) url = reverse('PyLucid-permalink', kwargs={ 'page_id': self.pagetree.id, 'url_rest': addition_txt }) return url
def get_permissions(self): """ returns the access permissions for this menu entry. TODO: Should be cache this? """ if not self.url_name: # a menu section # TODO: Check if at least one sub entry is accessible. return (False, (), False) url = self.get_url() if url is None: # can't resolve url, message was created. return (True, (), True) # view can only superusers use # Get the view function for this url_name view_func, func_args, func_kwargs = urlresolvers.resolve(url) # get the rights from pylucid_project.apps.pylucid.decorators.check_permissions try: access_permissions = view_func.access_permissions except AttributeError, err: # If no permissions available, fallback to superuser only request = ThreadLocal.get_current_request() if settings.DEBUG or request.user.is_staff: messages.error(request, ( "The view %s for url %r has no permissions attribute!" " Please use pylucid_project.apps.pylucid.decorators.check_permissions!" ) % (view_func.__name__, self.url_name) ) access_permissions = (True, (), True)
def get_absolute_url(self): """ absolute url (without domain/host part) TODO: Should be used a cache here? """ if not self.url_name: return "" # menu section url = self.get_url() if url is None: # can't resolve url, message was created. return "#resolve-error" # XXX: return something else? request = ThreadLocal.get_current_request() get_data = {} if self.get_pagetree and hasattr(request.PYLUCID, "pagetree"): get_data["pagetree"] = request.PYLUCID.pagetree.pk if self.get_pagemeta and hasattr(request.PYLUCID, "pagemeta"): get_data["pagemeta"] = request.PYLUCID.pagemeta.pk if self.get_page: if hasattr(request.PYLUCID, "pagecontent"): get_data["pagecontent"] = request.PYLUCID.pagecontent.pk elif hasattr(request.PYLUCID, "pluginpage"): get_data["pluginpage"] = request.PYLUCID.pluginpage.pk if get_data: # FIXME: There must be a better was to to this. # TODO: escape it. url += "?" + "&".join(["%s=%s" % (key, value) for key, value in get_data.items()]) return url
def done(self, form_list, **kwargs): invoice = None from django_tools.middlewares import ThreadLocal user = ThreadLocal.get_current_user().username klient = Klient.objects.get(nazwa=user) for form in form_list: if isinstance(form, ZamowienieForm): invoiceData = form.cleaned_data invoiceData.update({ 'klient': klient }) invoice = Zamowienie(**invoiceData) invoice.save() elif isinstance(form, BaseFormSet): for posForm in form.forms: if isinstance(posForm, PozycjaZamowieniaForm): positionData = posForm.cleaned_data positionData.update({ 'zamowienie': invoice }) position = PozycjaZamowienia(**positionData) position.save() else: posForm.save() self.storage.reset() return render_to_response('wizard/stepDone.html', {'zamowienie': invoice, 'pozycje': PozycjaZamowienia.objects.filter(zamowienie_id=invoice.pk)}, context_instance=RequestContext(ThreadLocal.get_current_request()))
def get_absolute_url(self): country = ThreadLocal.get_current_request().country return reverse('source_view', kwargs={ 'pk': self.pk, 'country': country, })
def done(self, form_list, **kwargs): invoice = None from django_tools.middlewares import ThreadLocal user = ThreadLocal.get_current_user().username klient = Klient.objects.get(nazwa=user) for form in form_list: if isinstance(form, ZamowienieForm): invoiceData = form.cleaned_data invoiceData.update({'klient': klient}) invoice = Zamowienie(**invoiceData) invoice.save() elif isinstance(form, BaseFormSet): for posForm in form.forms: if isinstance(posForm, PozycjaZamowieniaForm): positionData = posForm.cleaned_data positionData.update({'zamowienie': invoice}) position = PozycjaZamowienia(**positionData) position.save() else: posForm.save() self.storage.reset() return render_to_response('wizard/stepDone.html', { 'zamowienie': invoice, 'pozycje': PozycjaZamowienia.objects.filter(zamowienie_id=invoice.pk) }, context_instance=RequestContext( ThreadLocal.get_current_request()))
def _setup_tag_filter(self): """ prepare the tag queryset filter """ def get_data(field_name): return self.initial.get(field_name, None) or self.data.get(field_name, None) language = get_data("language") if not language: # Use current language for tag queryset filter request = ThreadLocal.get_current_request() language = request.PYLUCID.current_language pagetree_id = get_data("pagetree") if pagetree_id: pagetree = PageTree.objects.only("site").get(id=pagetree_id) site = pagetree.site else: # Use current site for tag queryset filter site = settings.SITE_ID # change the tag queryset filter: self.fields["tags"].widget.tag_queryset_filters = { "language": language, "pagetree__site": site, }
def __init__(self, sub_id): self.BASE_URL = FIGSHARE_API_URLS['base_url'] request = ThreadLocal.get_current_request() self.TOKEN = Figshare().get_token_for_user(request.user.id)['token'] self.HEADERS = {'Authorization': 'token ' + self.TOKEN} self.MEDIA_ROOT = settings.MEDIA_ROOT self.transfer_token = RemoteDataFile().create_transfer(sub_id)['_id']
def get_absolute_url(self): """ absolute url (without domain/host part) TODO: Should be used a cache here? """ if not self.url_name: return "" # menu section url = self.get_url() if url is None: # can't resolve url, message was created. return "#resolve-error" # XXX: return something else? request = ThreadLocal.get_current_request() get_data = {} if self.get_pagetree and hasattr(request.PYLUCID, "pagetree"): get_data["pagetree"] = request.PYLUCID.pagetree.pk if self.get_pagemeta and hasattr(request.PYLUCID, "pagemeta"): get_data["pagemeta"] = request.PYLUCID.pagemeta.pk if self.get_page: if hasattr(request.PYLUCID, "pagecontent"): get_data["pagecontent"] = request.PYLUCID.pagecontent.pk elif hasattr(request.PYLUCID, "pluginpage"): get_data["pluginpage"] = request.PYLUCID.pluginpage.pk if get_data: # FIXME: There must be a better was to to this. # TODO: escape it. url += "?" + "&".join( ["%s=%s" % (key, value) for key, value in get_data.items()]) return url
def __init__(self, *args, **kwargs): """ prepare the tag queryset filter """ super(TagLanguageSitesFilter, self).__init__(*args, **kwargs) def get_data(field_name): return self.initial.get(field_name, None) or self.data.get( field_name, None) language = get_data("language") if not language: # Use current language for tag queryset filter request = ThreadLocal.get_current_request() language = request.PYLUCID.current_language sites = get_data("sites") if not sites: # Use current site for tag queryset filter sites = [settings.SITE_ID] # change the tag queryset filter: self.fields["tags"].widget.tag_queryset_filters = { "language": language, self.sites_filter: sites, }
def __init__(self, *args, **kwargs): """ prepare the tag queryset filter """ super(TagLanguageSitesFilter, self).__init__(*args, **kwargs) def get_data(field_name): return self.initial.get(field_name, None) or self.data.get(field_name, None) language = get_data("language") if not language: # Use current language for tag queryset filter request = ThreadLocal.get_current_request() language = request.PYLUCID.current_language sites = get_data("sites") if not sites: # Use current site for tag queryset filter sites = [settings.SITE_ID] # change the tag queryset filter: self.fields["tags"].widget.tag_queryset_filters = { "language": language, "sites__id__in": sites, }
def log_action(self, app_label, action, request=None, message=None, long_message=None, data=None): if request is None: request = ThreadLocal.get_current_request() kwargs = { "uri": request.build_absolute_uri(), "app_label": app_label, "action": action, "message": message, "long_message": long_message, "data": data, } if hasattr(request, "PYLUCID"): kwargs["used_language"] = request.PYLUCID.current_language for key in META_KEYS: value = request.META.get(key) if value and len(value) > 255: value = "%s..." % value[:252] kwargs[key.lower()] = value new_entry = self.model(**kwargs) new_entry.save() return new_entry
def generate_copo_sample_form(source_id=None, sample_id=None): profile_id = ThreadLocal.get_current_request().session['profile_id'] # if there are sources in the profile, create a dropdown showing the sources and a box to create a new one # if there are no sources in the profile, create the new source form output = '' if ProfileInfo(profile_id).source_count() > 0: # get sources sources = Source(profile_id).get_all_sources() output += "<div id='source_select'>" output += generate_copo_source_dropdown(sources) output += generate_copo_source_add_button() output += "</div>" output += "<div id='new_source_div'>" output += generate_copo_source_form_html() output += "</div>" else: output += "<div id='new_source_div'>" output += generate_copo_source_form_html() output += "</div>" output += generate_copo_sample_form_html() return output
def get_permissions(self): """ returns the access permissions for this menu entry. TODO: Should be cache this? """ if not self.url_name: # a menu section # TODO: Check if at least one sub entry is accessible. return (False, (), False) url = self.get_url() if url is None: # can't resolve url, message was created. return (True, (), True) # view can only superusers use # Get the view function for this url_name view_func, func_args, func_kwargs = urlresolvers.resolve(url) # get the rights from pylucid_project.apps.pylucid.decorators.check_permissions try: access_permissions = view_func.access_permissions except AttributeError, err: # If no permissions available, fallback to superuser only request = ThreadLocal.get_current_request() if settings.DEBUG or request.user.is_staff: messages.error(request, ( "The view %s for url %r has no permissions attribute!" " Please use pylucid_project.apps.pylucid.decorators.check_permissions!" ) % (view_func.__name__, self.url_name)) access_permissions = (True, (), True)
def get_current_language(): """ Get the current language from request """ request = ThreadLocal.get_current_request() if request: return request.LANGUAGE_CODE else: return properties.LANGUAGE_CODE
def _get_callable(self, obj, attr): """ Check if the attr is callable, return its value if it is """ try: _attr = getattr(obj, attr) if callable(_attr): request = ThreadLocal.get_current_request() return _attr(request=request) except AttributeError: # not a model/object attribute or relation does not exist pass return None
def get_html(self): """ return the marker_text as html """ request = ThreadLocal.get_current_request() html = apply_markup( raw_content=self.marker_text, markup_no=self.markup, request=request ) # Needed for JavaScript: html = html.strip().replace("\n", "").replace('"', '\"') return mark_safe(html)
def do_sample_wizard_components(self): self.context['wiz_message'] = d_utils.json_to_pytype(lkup.MESSAGES_LKUPS["sample_wizard_messages"])[ "properties"] self.context['wiz_howtos'] = d_utils.json_to_pytype(lkup.MESSAGES_LKUPS["sample_wizard_howto"]) self.context['wizard_stages'] = self.wizard_helper.generate_stage_items() # get all records: used in the UI for 'cloning' and other purposes profile_id = ThreadLocal.get_current_request().session['profile_id'] self.context["component_records"] = htags.generate_component_records("sample", profile_id) return self.context
def get_current_host(): """ Get the current hostname with protocol E.g. http://localhost:8000 or https://bluebottle.org """ request = ThreadLocal.get_current_request() if request.is_secure(): scheme = 'https' else: scheme = 'http' return '{0}://{1}'.format(scheme, request.get_host())
def get_current(self, request=None): """ return client Language instance, if not available, use get_default_lang_entry() """ if request == None: request = ThreadLocal.get_current_request() if request == None: # no request available, e.g. loading fixtures return self._get_default_language() language_list = self.get_languages(request) return language_list[0]
def get_current_host(include_scheme=True): """ Get the current hostname with protocol E.g. http://localhost:8000 or https://bluebottle.org """ request = ThreadLocal.get_current_request() host = request.get_host() if include_scheme: if request.is_secure(): scheme = 'https' else: scheme = 'http' return '{0}://{1}'.format(scheme, request.get_host()) else: return host
def auto_order_posten(self): queryset = RechnungsPosten.objects.filter(rechnung=self.rechnung).exclude(pk=self.pk).order_by("-order").only("order") try: last_order = queryset[0].order except IndexError: # This is the first RechnungsPosten self.order = 1 else: if last_order is None: self.order = 1 else: self.order = last_order + 1 request = ThreadLocal.get_current_request() if request: # also called from a management command messages.debug(request, "Auto add order numer %i to %r" % (self.order, self.beschreibung))
def permalink(self, obj): """ view on site link in admin changelist, try to use complete uri with site info. """ current_site = Site.objects.get_current() count = obj.sites.filter(id=current_site.id).count() if count == 0: # TODO: Create a link with the domain of the first site return u"<i>[not on current site]</i>" request = ThreadLocal.get_current_request() permalink = obj.get_permalink(request) if permalink is None: return u"<i>[no permalink available]</i>" context = {"permalink": permalink} html = render_to_string('admin/blog/permalink.html', context) return html
def failsafe_message(msg, level=messages.INFO): """ Display a message to the user. Use ThreadLocalMiddleware to get the current request object. If no request object is available, create a warning. """ request = ThreadLocal.get_current_request() if request: # create a normal user message try: messages.add_message(request, level, msg) except Exception, err: # e.g.: # Without the django.contrib.messages middleware, # messages can only be added to authenticated users. msg += " (Error create a message: %s)" % err else: return
def log_action(self, app_label, action, request=None, message=None, long_message=None, data=None): if request is None: request = ThreadLocal.get_current_request() kwargs = { "uri": request.build_absolute_uri(), "app_label": app_label, "action": action, "message": message, "long_message": long_message, "data": data, } if hasattr(request, "PYLUCID"): kwargs["used_language"] = request.PYLUCID.current_language preferences = request.PYLUCID.preferences # Get SystemPreferences else: from pylucid_project.apps.pylucid.preference_forms import SystemPreferencesForm # import loops preferences_form = SystemPreferencesForm() preferences = preferences_form.get_preferences() for key in META_KEYS: value = request.META.get(key) if value and len(value) > 255: value = "%s..." % value[:252] kwargs[key.lower()] = value new_entry = self.model(**kwargs) new_entry.save() # Auto cleanup Log Table to protect against overloading. max_count = preferences.get("max_log_entries", 1000) queryset = LogEntry.objects.order_by('-createtime') ids = tuple(queryset[max_count:].values_list('id', flat=True)) if ids: queryset.filter(id__in=ids).delete() return new_entry
def get_client_ip(request=None): """ A utility method that returns the client IP for the given request. """ if not request: request = ThreadLocal.get_current_request() try: x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') except AttributeError: x_forwarded_for = None if x_forwarded_for: ip = x_forwarded_for.split(',')[0] else: try: ip = request.META.get('REMOTE_ADDR') except AttributeError: ip = None return ip
def check_sub_page_permissions(self, attributes, exclude, message_dict, queryset): """ Warn user if PageTree permissions mismatch with sub pages. self.check_sub_page_permissions( ("permitViewGroup", "permitEditGroup"), exclude, message_dict, queryset ) """ request = ThreadLocal.get_current_request() if request is None: # Check only if we are in a request return attributes2 = [] for attribute in attributes: if attribute not in exclude and attribute not in message_dict: # ...and don't check if ValidationError exist for this field attributes2.append(attribute) if not attributes2: return sub_pages = queryset.only(*attributes2) for attribute in attributes2: own_permission = getattr(self, attribute) for sub_page in sub_pages: sub_page_permission = getattr(sub_page, attribute) if sub_page_permission != own_permission: msg = _( "Permission mismatch:" " current %(attribute)s is set to '%(own_permission)s'" " and sub page '%(slug)s' used '%(sub_permission)s'." " This may be ok." ) % { "slug": sub_page.get_absolute_url(), "attribute": attribute, "own_permission": own_permission, "sub_permission": sub_page_permission, } messages.warning(request, msg)
def check_sub_page_permissions(self, attributes, exclude, message_dict, queryset): """ Warn user if PageTree permissions mismatch with sub pages. self.check_sub_page_permissions( ("permitViewGroup", "permitEditGroup"), exclude, message_dict, queryset ) """ request = ThreadLocal.get_current_request() if request is None: # Check only if we are in a request return attributes2 = [] for attribute in attributes: if attribute not in exclude and attribute not in message_dict: # ...and don't check if ValidationError exist for this field attributes2.append(attribute) if not attributes2: return sub_pages = queryset.only(*attributes2) for attribute in attributes2: own_permission = getattr(self, attribute) for sub_page in sub_pages: sub_page_permission = getattr(sub_page, attribute) if sub_page_permission != own_permission: msg = _( "Permission mismatch:" " current %(attribute)s is set to '%(own_permission)s'" " and sub page '%(slug)s' used '%(sub_permission)s'." " This may be ok.") % { "slug": sub_page.get_absolute_url(), "attribute": attribute, "own_permission": own_permission, "sub_permission": sub_page_permission, } messages.warning(request, msg)
def get_preferences(self): """ Fall back to initial data, if something wrong with system preferences. This is important, because nothing would work, if validation error raised. """ try: return super(SystemPreferencesForm, self).get_preferences() except ValidationError, e: self.data = self.save_form_init() msg = 'Reset system preferences cause: %s' % e request = ThreadLocal.get_current_request() try: messages.info(request, msg) except MessageFailure: # If message system is not initialized, e.g.: # load the system preferences on module level warnings.warn(msg) return self.data
def get_client_ip(request=None): """ A utility method that returns the client IP for the given request. """ if not request: request = ThreadLocal.get_current_request() try: x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR') except AttributeError: x_forwarded_for = None if x_forwarded_for: ipa = x_forwarded_for.split(',')[0] else: try: ipa = request.META.get('REMOTE_ADDR') except AttributeError: ipa = None return ipa
def get_absolute_uri(self): """ returned the complete absolute URI (with the domain/host part) """ request = ThreadLocal.get_current_request() is_secure = request.is_secure() if is_secure: protocol = "https://" else: protocol = "http://" site = self.get_site() domain = site.domain if "://" in domain: domain2 = domain.split("://", 1)[-1] msg = ("Wrong site domain %r: protocol should not inserted there!" " (Please change it to: %r)") % (domain, domain2) messages.error(request, msg) domain = domain2 absolute_url = self.get_absolute_url() return protocol + domain + absolute_url
def get_authorize_url(): request_token_url = 'http://api.figshare.com/v1/pbl/oauth/request_token' authorization_url = 'http://api.figshare.com/v1/pbl/oauth/authorize' #Obtain request token request = ThreadLocal.get_current_request() domain = request.META['HTTP_HOST'] callback_uri = 'http://' + domain + reverse('rest:set_figshare_credentials') oauth = OAuth1Session(client_key, client_secret=client_secret, callback_uri=callback_uri) fetch_response = oauth.fetch_request_token(request_token_url) request.session['resource_owner_key'] = fetch_response.get('oauth_token') request.session['resource_owner_secret'] = fetch_response.get('oauth_token_secret') #Obtain Authorize Token authorize_url = authorization_url + '?oauth_token=' authorize_url = authorize_url + request.session['resource_owner_key'] #redirect user to auth page return authorize_url
def _send(self, email_message): """ Force recipient to the current user.""" request = ThreadLocal.get_current_request() if request.user.is_authenticated(): recipient = request.user.email else: recipient = str(email_message.recipients()[0]) print recipient if '+test' not in recipient: return False try: email_message.subject += ' || To: ' + str(email_message.recipients()[0]) message_string = email_message.message().as_string() self.connection.sendmail(email_message.from_email, recipient, message_string) except: if not self.fail_silently: raise return False return True
def get_absolute_uri(self): """ returned the complete absolute URI (with the domain/host part) """ request = ThreadLocal.get_current_request() is_secure = request.is_secure() if is_secure: protocol = "https://" else: protocol = "http://" site = self.get_site() domain = site.domain if "://" in domain: domain2 = domain.split("://", 1)[-1] msg = ( "Wrong site domain %r: protocol should not inserted there!" " (Please change it to: %r)" ) % (domain, domain2) messages.error(request, msg) domain = domain2 absolute_url = self.get_absolute_url() return protocol + domain + absolute_url
def submit_to_figshare(article_id): try: token_object = retrieve_token() collection = FigshareCollection().get_collection_head_from_article(article_id) article = FigshareCollection().get_article(article_id) request = ThreadLocal.get_current_request() # get file path p = path.join(article['path'], article['hashed_name']) new_name = path.join(settings['MEDIA_ROOT'], article['original_name']) shutil.copyfile(p, new_name) # make article on figshare figshare_article = make_article(name=collection['name'], description=article['description'], type=article['article_type'], oauth=token_object) figshare_article_id = figshare_article['article_id'] FigshareCollection().add_figshare_accession_to_article(figshare_id=figshare_article_id, article_id=article_id) FigshareCollection().add_figshare_url_to_article(figshare_id=figshare_article_id, article_id=article_id) add_file_to_article(oauth=token_object, article_id=figshare_article_id, filename=new_name) for tag in article['tags']: add_tags_to_article(oauth=token_object, article_id=figshare_article_id, tag=tag) except RuntimeError as e: print(e) return None return figshare_article_id
def recusive_attribute(self, attribute): """ Goes the pagetree back to root and return the first match of attribute if not None. used e.g. with permitViewGroup and permitEditGroup from self.validate_permit_group() and self.check_sub_page_permissions() """ parent_pagetree = self.pagetree.parent if parent_pagetree is None: # parent is the tree root return None request = ThreadLocal.get_current_request() if request is None: # Check only if we are in a request return queryset = PageMeta.objects.filter(pagetree=parent_pagetree) parent_pagemeta = None languages = request.PYLUCID.languages # languages are in client prefered order for language in languages: try: parent_pagemeta = queryset.get(language=language) except PageMeta.DoesNotExist: continue else: break if parent_pagemeta is None: return if getattr(parent_pagemeta, attribute) is not None: # the attribute was set by parent page return parent_pagemeta else: # go down to root return parent_pagemeta.recusive_attribute(attribute)
def _send(self, email_message): """ Force recipient to the current user.""" request = ThreadLocal.get_current_request() try: request.user.is_authenticated() recipient = request.user.email except Exception: recipient = str(email_message.recipients()[0]) if '+test' not in recipient: return False try: email_message.subject += ' || To: ' + \ str(email_message.recipients()[0]) message_string = email_message.message().as_string() self.connection.sendmail(email_message.from_email, recipient, message_string) except Exception: if not self.fail_silently: raise return False return True
def get_source_count(self): profile_id = ThreadLocal.get_current_request().session['profile_id'] num_sources = ProfileInfo(profile_id).source_count() return HttpResponse(encode({'num_sources': num_sources}))
def get_base_url(): r = ThreadLocal.get_current_request() scheme = r.scheme domain = r.get_host() return scheme + "://" + domain
def submit(self, sub_id, dataFile_ids=None): s = Submission().get_record(ObjectId(sub_id)) if s["meta"]["new_or_existing"] == "new": # create and get item_id data = self._create_ckan_metadata(s) fullurl = self.host["url"] + "package_create" resp = requests.post(fullurl, json=data, headers=self.headers) if resp.status_code == 200: # package was created normally data = json.loads(resp.content.decode("utf-8")) dataset_id = data["result"]["id"] data = {"package_id": dataset_id} fullurl = self.host["url"] + "resource_create" elif resp.status_code == 400: instance = re.findall("https", fullurl) if len(instance) == 0: fullurl = fullurl.replace("http", "https") resp = requests.post(fullurl, json=data, headers=self.headers) if resp.status_code != 200: details = json.loads(resp.content.decode("utf-8")) try: msg = details["error"]["message"] except KeyError: msg = details["error"]["name"][0] return json.dumps({ "status": resp.status_code, "message": msg }) else: data = json.loads(resp.content.decode("utf-8")) dataset_id = data["result"]["id"] data = {"package_id": dataset_id} fullurl = self.host["url"] + "resource_create" elif resp.status_code == 409: # there is a conflict so update rather than create print(resp.reason) fullurl = self.host["url"] + "package_show" resp = requests.post(fullurl, json={"name_or_id": data["name"]}) data = json.loads(resp.content.decode("utf-8")) dataset_id = data["result"]["id"] data = {"package_id": dataset_id} fullurl = self.host["url"] + "resource_create" else: return json.dumps({ "status": resp.status_code, "message": resp.reason + " - " + resp.text }) else: data = {"package_id": s["meta"]["identifier"]} # now we have a dataset id to which to add the datafile for f in s["bundle"]: # data = dict() df = DataFile().get_record(ObjectId(f)) # upload file # get correct bitstream file extension lookup try: filename, file_extension = os.path.splitext(df["name"]) if "." in file_extension: file_extension = file_extension.replace(".", "") ext = self.get_media_type_from_file_ext(file_extension) except: ext = "" now = str(datetime.date.today()) print(df["name"]) data["name"] = df["name"] data["created"] = now data["mimetype"] = ext fullurl = self.host["url"] + "resource_create" url = parse.urlparse(self.host["url"]) #data["url"] = urljoin(self.hostname, "dataset/" + str(uuid.uuid4())) with open(df["file_location"], 'rb') as f: files = [('upload', (df["name"], f, ext))] # data["upload"] = files try: print(self.headers) resp = requests.post(fullurl, data=data, files=files, headers=self.headers) # print(resp.json()['headers']) except (TypeError, ValueError) as e: print(e) # for some reason this fails the first time resp = requests.post(fullurl, data=data, files=files, headers=self.headers) except TypeError as t: print(t) if resp.status_code == 200: req = ThreadLocal.get_current_request() details = json.loads(resp.content.decode("utf-8")) details["result"]["repo_url"] = self.host["url"] #details["result"]["url"] = req.build_absolute_uri("/") + "rest/get_accession_data?sub_id=" + sub_id self._update_and_complete_submission(details, sub_id) elif resp.status_code == 400: # try again checking for https instance = re.findall("https", fullurl) if len(instance) == 0: fullurl = fullurl.replace("http", "https") resp = requests.post(fullurl, data=data, files=f, headers=self.headers) if resp.status_code != 200: msg = json.loads( resp.content.decode("utf-8"))["error"]["message"] return {"status": resp.status_code, "message": msg} details = json.loads(resp.content.decode("utf-8")) details["result"]["repo_url"] = self.host["url"] self._update_and_complete_submission(details, sub_id) elif resp.status_code == 409: fullurl = self.host["url"] + "package_show" resp = requests.post(fullurl, data={"id": dataset_id}) # now iterate through resources to get matching name resources = json.dumps( resp.content.decode("utf-8"))["result"]["resources"] fullurl = self.host["url"] + "resource_update" # Submission().mark_submission_complete(ObjectId(sub_id)) else: return json.dumps({ "status": resp.status_code, "message": resp.reason + " - " + resp.text }) Submission().mark_submission_complete(ObjectId(sub_id)) return True
def __init__(self): self.profile_id = ThreadLocal.get_current_request().session['profile_id'] self.schema = Sample().get_schema().get("schema_dict")
def get_current_request(): return ThreadLocal.get_current_request()
def __init__(self, description_token=str(), description_targets=list()): self.datafile_id = str() self.description_token = description_token self.description_targets = description_targets self.targets_datafiles = self.set_targets_datafiles() self.profile_id = ThreadLocal.get_current_request().session['profile_id']